初始化UIView对象时dispatch_async

时间:2015-08-13 17:36:03

标签: ios swift 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后,我说视图需要几分钟时间才能显示在屏幕上。

1 个答案:

答案 0 :(得分:3)

应该在主线程上进行

UIView操作 来自doc

  

线程注意事项

     

必须对应用程序的用户界面进行操作   主线程。因此,您应该始终调用UIView的方法   来自应用程序主线程中运行的代码的类。该   只有在创建视图时,这可能不是绝对必要的时间   对象本身,但所有其他操作应该发生在主要   线程。

如果你必须创建许多UIView对象,那么就这样做 dispatch_async(),但为此目的使用main_queue。还有一件事,如果你想使用后台线程,那么考虑使用CALayer我们可以做大部分CALayer工作在后台线程