你好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?
请充分阅读我的问题并建议我,如果我做错了什么。非常感谢您的帮助和时间。
到1)
这简单地说,来自同一队列的任务可以在不同的线程上运行。它没有说,任务无法在特定线程上运行。 (但我真的不希望在主线程上运行任务。)
到2)
Apple没有说,从不同的线程更新UI在每种情况下都会失败,但可能会失败。你不应该这样做:有一次它会失败。
你应该读这个: