我如何在后台线程中准备我的UI?
一个UIViewController
需要大约半秒来加载其内容并出现在屏幕上。 我怎样才能使他们都加载在后台,并显示他们准备好了?
Apple开发人员网站上有一个LazyTableImages示例。
它显示了如何在后台线程中执行繁重的工作并更新主线程上的UI。
PerformSelectorInBackground:withObject:
是一个可能的解决scheme,但更现代的方法是使用asynchronous块。 您可以在这些块内的主线程上运行代码以安全地更新UI。
“并发编程指南”是查找更多信息和示例的好地方。
后台线程不能更新UI,你可以在后台线程中执行所有的处理逻辑,并调用UI更新的主线程
示例加载一个tableView与数据,使用后台线程来处理一切,并加载数据,使用主线程调用[tableView reloadData]
,请参阅大中央调度,以了解如何使用线程在IOS ..
希望能帮助到你
创build一个GCD队列在后台线程中处理你的工作(阅读文档,因为我的“创build”标签和选项可能不是你想要的)。
您可以asynchronous地将其发送到队列中,这意味着对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
你只是通过一个select器,它会在后台快乐,而不是阻止你的用户界面。 但请注意,后台线程有规则。
你不应该从后台线程更新你的用户界面。 你需要确保你所调用的方法是线程安全的。