一个UIViewController
大约需要半秒钟加载其内容,并显示在屏幕上。 我怎样才能让他们都在后台加载,当他们准备好出现?
Answer 1:
有一个LazyTableImages在苹果开发者网站的样本。
它显示了如何在后台线程中执行繁重和更新在主线程的UI。
PerformSelectorInBackground:withObject:
是一种可能的解决方案,尽管更现代的方法将是使用异步块。 您可以从这些块中运行的主线程代码安全地更新UI。
并发编程指南是找到更多的信息,这样的例子的好地方。
Answer 2:
后台线程不能更新UI,您可以在后台线程中执行所有的处理逻辑,并呼吁UI更新主线程
例如加载的tableView与数据,使用后台线程来处理一切,并加载数据,调用[tableView reloadData]
利用为主线,看到大中央调度知道如何与IOS中的线程工作..
希望能帮助到你
Answer 3:
创建一个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);
Answer 4:
最简单的方法是使用NSObject中的- (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg
你只是传递一个选择,它会高兴在后台,而不是阻止你的UI。 注意然而,有规则,后台线程。
你不应该更新从后台线程的UI。 你需要确保你调用的方法是线程安全的。
文章来源: How do I prepare my UI in a background thread?