1

AUIViewController需要大约半秒来加载其内容并出现在屏幕上。我怎样才能让它们全部加载到后台并在它们准备好时出现?

4

4 回答 4

2

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

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

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

并发编程指南是查找更多信息和示例的好地方。

于 2012-05-23T12:06:55.630 回答
1

后台线程不能更新UI,你可以在后台线程中执行所有的处理逻辑并调用主线程进行UI更新

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

希望能帮助到你

于 2012-05-23T13:28:34.660 回答
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);
于 2012-05-23T14:24:27.270 回答
0

最简单的方法是使用 NSObject 的- (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg您只需将选择器传递给它,它就会在后台运行并且不会阻塞您的 UI。但是请注意,后台线程有一些规则。

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

于 2012-05-23T12:00:55.117 回答