我们可以从后台线程更新UI吗?

时间:2018-02-16 04:07:20

标签: ios objective-c multithreading grand-central-dispatch dispatch-async

你好iOS专家只是为了清除我的概念我对主线程的UI更新有点困惑。 Apple的要求是所有与UI相关的东西都应该在主Thread.So中进行测试:

案例1:我以异步方式将任务分派给全局调度并发队列。经过一些处理后,我直接从并发队列(后台线程)更新我的UI东西,使用下面的代码正常工作。

dispatch_queue_t myGlobalQueue;
myGlobalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_async(myGlobalQueue, ^{

     // Some processing
    // Update UI;
});

案例2:比我尝试了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:在case1中我们仍然在主线程中而不是在后台线程中?如果是这样,为什么Apple医生说:

  

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

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

2:在Case1中,如果我们在后台线程,那么为什么Apple需要获取主线程进行UI更新,即使我们也可以从后台线程更新UI?

请充分阅读我的问题并建议我,如果我做错了什么。非常感谢您的帮助和时间。

1 个答案:

答案 0 :(得分:4)

至1)

这简单地说,来自同一队列的任务可以在不同的线程上运行。它没有说,任务无法在特定线程上运行。 (但我真的不希望在主线程上运行任务。)

至2)

Apple没有说,从不同的线程更新UI 会在每种情况下都失败,但可以失败。你不应该这样做:有一次它会失败。

你应该读到这个:

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

相关问题