所以这就是问题:
我有很多次级视图的重要视图,我需要加载然后显示。我想异步这样做,这样我就不会阻止我的主线程。当我试图以异步方式进行时,我遇到了以下两难困境:
完成所有繁重的工作后,我回到主队列实际显示那些东西,我遇到了问题。首先,即使一切都已完成,所有视图都需要30-60秒才能显示。有时他们会错位。我可能做错了什么,我应该寻找什么?
private func loadScrollViews() {
let qos = Int(QOS_CLASS_USER_INTERACTIVE.value)
dispatch_async(dispatch_get_global_queue(qos, 0)) { () -> Void in
// Creating many UIViews
for var i = 0; i < 100; i++ {
let view = UIView(frame: someFrame)
self.viewCollection.append(view)
}
dispatch_async(dispatch_get_main_queue(), { () -> Void in
self.displayViews()
})
}
}
private func displayViews() {
for view in self.viewCollection {
self.contentView.addSubview(view)
}
self.activityIndicator.stopAnimating()
self.contentView.hidden = false
}
执行displayViews后,我说视图需要几分钟时间才能显示在屏幕上。
答案 0 :(得分:3)
UIView
操作
来自doc
线程注意事项
必须对应用程序的用户界面进行操作 主线程。因此,您应该始终调用UIView的方法 来自应用程序主线程中运行的代码的类。该 只有在创建视图时,这可能不是绝对必要的时间 对象本身,但所有其他操作应该发生在主要 线程。
如果你必须创建许多UIView对象,那么就这样做
dispatch_async()
,但为此目的使用main_queue
。还有一件事,如果你想使用后台线程,那么考虑使用CALayer
我们可以做大部分CALayer
工作在后台线程