如何在后台线程中准备我的UI?

时间:2012-05-23 11:58:11

标签: ios multithreading cocoa-touch

UIViewController需要大约半秒才能加载其内容并显示在屏幕上。如何让它们在后台加载并在它们准备好后出现?

4 个答案:

答案 0 :(得分:2)

Apple开发者网站上有一个LazyTableImages示例。

它展示了如何在后台线程中执行繁重的工作并更新主线程上的UI。

PerformSelectorInBackground:withObject:是一种可能的解决方案,但更现代的方法是使用异步块。您可以在这些块中的主线程上运行代码以安全地更新UI。

The Concurrency Programming Guide是查找更多信息和示例的好地方。

答案 1 :(得分:1)

后台线程无法更新UI,您可以在后台线程中执行所有处理逻辑并调用主线程进行UI更新

使用Data加载tableView的示例,使用后台线程处理所有内容并加载数据,使用主线程调用[tableView reloadData],请参阅Grand Central Dispatching以了解如何在IOS中使用线程.. < / p>

希望它有助于

答案 2 :(得分:1)

创建一个GCD队列以在后台线程中处理您的工作(阅读文档,因为我的“创建”标签和选项可能不是您想要的)。

您将异步发送到队列,这意味着对dispatch_async的调用将对您在另一个线程中运行的代码块进行适当的安排,然后它会“立即”返回给您。

您提供的块中的所有工作都将在一个单独的线程上执行。注意,最后,你进行另一次调用,这次使用众所周知的主队列。这将安排该代码在主线程中运行,这对于任何UI工作都是必需的。

另外,您真的应该阅读有关GCD的文档,特别是块,因为有内存和周期注意事项。祝你好运。

dispatch_queue_t workQ = dispatch_queue_create("bgWorkQ", 0);
dispatch_async(workQ, ^{
    // This code is now running in a background thread.
    // Do all your loading here...
    // When ready to touch the UI, you must do that in the main thread...
    disptach_async(dispatch_get_main_queue(), ^{
        // Now, this code is running in the main thread.
        // Update your UI...
    });
});
dispatch_release(workQ);

答案 3 :(得分:0)

最简单的方法是使用NSObject的- (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg你只需传递一个选择器,它会在后台开心并且不会阻止你的UI。但请注意,后台线程有规则。

您不应该从后台线程更新UI。而且你需要确保你调用的方法是线程安全的。