问题来了:
我有几个沉重的视图与许多子视图,我需要加载,然后显示。我想异步执行,这样就不会阻塞主线程。当我尝试异步执行时,我遇到了以下困境:
在所有繁重的工作完成后,我返回到主队列实际显示这些东西,我遇到了问题。首先,即使一切都完成了,所有的视图都需要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被执行之后,正如我说的,视图几乎需要一分钟才能出现在屏幕上
UIView
操作应该在主线程上完成从医生
线程问题对应用程序用户界面的操作必须发生在主线程。因此,你应该总是调用UIView的方法从在应用程序主线程中运行的代码中初始化。的只有在创建视图时才不需要这样做对象本身,但所有其他操作都应在主对象上进行线程。
如果你需要创建很多UIView对象那么这样做dispatch_async()
,但使用main_queue
用于此目的。还有一件事,如果你想使用后台线程,那就考虑使用CALayer
我们可以在后台线程上完成CALayer
的大部分工作