UIViewController
需要大约半秒才能加载其内容并显示在屏幕上。如何让它们在后台加载并在它们准备好后出现?
答案 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。而且你需要确保你调用的方法是线程安全的。