我试图从文档目录将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()
,所以队列永远不会执行任何块。
注意:这是一个非常模糊的队列选项,通常,除非有充分的理由,否则不应该使用它。