如何准备我的UI在后台线程?(How do I prepare my UI in a backgro

2019-09-17 11:01发布

一个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?