我们可以从背景线程更新UI吗?



您好iOS专家只是为了清除我的概念,我对主线程UI更新有些困惑。Apple的要求是所有与UI相关的内容都应在主线程中执行。因此测试:

case1:我将任务派遣到全局调度并发队列异步。处理后,我直接从并发队列(背景线程(直接更新我的UI内容,使用以下代码正常工作。

dispatch_queue_t myGlobalQueue;
myGlobalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(myGlobalQueue, ^{
     // Some processing
    // Update UI;
});

case2:比我尝试过的Apple所需的方式,将块分配到全局派遣的并发队列异步。处理后,我使用以下代码更新主线程中的UI内容:

dispatch_queue_t myGlobalQueue;
myGlobalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(myGlobalQueue, ^{
    // Some processing
    dispatch_async(dispatch_get_main_queue(), ^{
        // UI Updation
    });
});

现在,在这两种情况下,我都会得到相同的结果。现在听我的问题

问题: 1:在案例1中,我们仍然在主线程中不在后台线程中吗?如果是为什么Apple Doc说的话:

并发队列(也称为全局调度队列(同时执行一个或多个任务,但任务仍在 将它们添加到队列的顺序。当前 执行任务在由不同的线程上运行 调度队列。在任何给定的任务执行的确切任务数 点是可变的,取决于系统条件。

现在,如果我们在主线程上,那么这与Apple Doc的大胆部分矛盾。

2:在案例1中,如果我们在后台线程中,那么为什么Apple也需要为UI更新获得主线程,即使我们也可以从背景线程中更新UI?

友好地阅读我的问题,建议我是否做错了什么。您的帮助和时间将不胜感激。

至1(

这简单地说,来自同一队列 can 的任务在不同的线程上运行。它没有说一个任务不能在特定线程上运行。(但是我真的不希望在主线程上运行任务。(

至2(

Apple并没有说,在每种情况下都会从其他线程更新UI Will 失败,但是 can can 失败。您不应该这样做:一次会失败。

您应该阅读此信息:

https://en.wikipedia.org/wiki/necctity_and_sufficied

最新更新