dispatch_async在初始化UIView对象时



问题来了:

我有几个沉重的视图与许多子视图,我需要加载,然后显示。我想异步执行,这样就不会阻塞主线程。当我尝试异步执行时,我遇到了以下困境:

在所有繁重的工作完成后,我返回到主队列实际显示这些东西,我遇到了问题。首先,即使一切都完成了,所有的视图都需要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的大部分工作

最新更新