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

问题描述 投票:1回答:1

你好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医生说:

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

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

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

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

ios objective-c multithreading grand-central-dispatch dispatch-async
1个回答
4
投票

到1)

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

到2)

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

你应该读这个:

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

© www.soinside.com 2019 - 2024. All rights reserved.