使用并发队列从文档目录加载多个图像,但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)
}
}
}
}

可能是因为concurrentQueue 中的以下UI操作导致UI被阻止

activity.startAnimating()

这是一个UI活动,您可能会收到异常或回溯,其中提到UI操作必须在主线程中完成。尝试删除/移动主线程中的activity.startAnimation((。UI可能无法按您的预期进行阻止和操作。

即使你使用了concurrentQueue,UI图像加载也是在主线程中用DispatchQueue.main完成的。sync这应该没问题。

删除,.initiallyInactive:

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

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

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

相关内容

  • 没有找到相关文章

最新更新