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