首页 > 解决方案 > 使用并发队列从文档目录加载多个图像,但 UI 仍然阻塞

问题描述

我试图从文档目录将 6 个图像加载到 6 个 imageViews。我使用了调度队列

  let concurrentQueue = DispatchQueue(label: "myConcurrentQueue", qos: .background, attributes: [.concurrent,.initiallyInactive], autoreleaseFrequency: .inherit, target: nil)

但即使我正在使用并发队列 UI 仍然没有响应,UI 被阻止

我用过下面的代码

 private func loadImagesConCurrent() {
    let concurrentQueue = DispatchQueue(label: "myConcurrentQueue", qos: .background, attributes: [.concurrent,.initiallyInactive], autoreleaseFrequency: .inherit, target: nil)
    dispatchq = concurrentQueue
    activity.startAnimating()
    for i in 0..<myArray.count {
        concurrentQueue.async { [weak self] in
            do {
                let location = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first
                let filename = URL(fileURLWithPath: location!).appendingPathComponent((self?.myArray[i]) as! String)
                     
                if let image = UIImage(contentsOfFile: filename.path) {
                      DispatchQueue.main.async {
                        self?.imagesCollection[i].image = image
                        print("loaded")
                        if i == (self?.myArray.count)! - 1 {
                            self?.activity.startAnimating()
                        }
                      }
                    }
            } catch {
                print(error.localizedDescription)
            }
        }
    }
}

标签: iosmultithreadinggrand-central-dispatch

解决方案


删除,.initiallyInactive

let concurrentQueue = DispatchQueue(label: "myConcurrentQueue", qos: .background, attributes: .concurrent, autoreleaseFrequency: .inherit, target: nil)

这个队列没有理由使用这个选项,而且因为看起来你从不调用dispatch_activate(),队列永远不会执行任何块。

注意:这是一个非常模糊的队列选项,通常,除非您有充分的理由,否则不应使用它。


推荐阅读