ios - 使用并发队列从文档目录加载多个图像,但 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)
}
}
}
}
解决方案
删除,.initiallyInactive
:
let concurrentQueue = DispatchQueue(label: "myConcurrentQueue", qos: .background, attributes: .concurrent, autoreleaseFrequency: .inherit, target: nil)
这个队列没有理由使用这个选项,而且因为看起来你从不调用dispatch_activate()
,队列永远不会执行任何块。
注意:这是一个非常模糊的队列选项,通常,除非您有充分的理由,否则不应使用它。
推荐阅读
- html - 如何使用空格减少空格:css 属性而不更改文本中的行高
标签
- asp.net-mvc - 如何使用 ASP.Net MVC 将对象值传输到模态类?
- cordova - Cordova Windows 应用程序未使用依赖项文件夹构建 appx
- vuetify.js - 如何自定义 Vuetify?
- c# - 使用 CsvHelper(或类似库)从变量中读取 CSV
- r - 定义因子数据的顺序
- ruby-on-rails - 如何从 Rails 应用程序内部运行 heroku restart?
- python - 用自己的数字替换每个字母
- apache-flink - 如何从 Apache Flink 的命令行传递和覆盖配置属性?
- python - 使用 tkinter 创建 python GUI 并尝试使用 OOP