AUIViewController
需要大约半秒来加载其内容并出现在屏幕上。我怎样才能让它们全部加载到后台并在它们准备好时出现?
4 回答
Apple 开发者网站上有一个LazyTableImages示例。
它展示了如何在后台线程中执行繁重的工作并在主线程上更新 UI。
PerformSelectorInBackground:withObject:
是一种可能的解决方案,尽管更现代的方法是使用异步块。您可以从这些块中在主线程上运行代码以安全地更新 UI。
并发编程指南是查找更多信息和示例的好地方。
后台线程不能更新UI,你可以在后台线程中执行所有的处理逻辑并调用主线程进行UI更新
使用数据加载 tableView 的示例,使用后台线程处理所有内容并加载数据,[tableView reloadData]
使用主线程调用,请参阅 Grand Central Dispatching 以了解如何在 IOS 中使用线程。
希望能帮助到你
创建一个 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);
最简单的方法是使用 NSObject 的- (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg
您只需将选择器传递给它,它就会在后台运行并且不会阻塞您的 UI。但是请注意,后台线程有一些规则。
您不应该从后台线程更新您的 UI。你需要确保你调用的方法是线程安全的。