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

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

您好iOS专家只是为了澄清我的概念,我对从主线程进行UI更新有些困惑。苹果的要求是所有与UI相关的东西都应该在主线程中执行,因此要测试:

案例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中,我们是否仍在主线程中而不在后台线程中?如果是这样,为什么苹果医生说:

Concurrent queues (also known as a type of global dispatch queue) execute one or more tasks concurrently, but tasks are still started in the order in which they were added to the queue. The currently executing tasks run on distinct threads that are managed by the dispatch queue. The exact number of tasks executing at any given point is variable and depends on system conditions.



现在,如果我们位于主线程上,那么这与Apple Doc的粗体部分是矛盾的。

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

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

最佳答案

到1)

简而言之,来自同一队列的任务可以在不同的线程上运行。这并不是说任务不能在特定线程上运行。 (但是我真的不希望在主线程上运行任务。)

至2)

苹果并没有说从每种情况下更新UI都会在每种情况下失败,但是可能失败。您不应该这样做:一次它将失败。

您应该阅读以下内容:

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

关于ios - 我们可以从后台线程更新UI吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48819925/

相关文章:

c++ - C/C++ - 运行系统 ("process &"),然后写入其标准输入

ios - 如何检查用户是否从我的另一个应用程序安装了我的应用程序? iOS(统一)

iphone - 如何使用 PhoneGap 在 iPhone 应用程序中添加 UITableview?

android - Phonegap 离线 map 与 OpenLayers 和 Open Street Maps

iOS XCode 获取 IDEPseudoTerminalDomain 错误 1

ios - 添加到mapkit时如何自动选择注释

c++ - std::thread :如何在类主体中将线程声明为普通成员?

ios - 无法将类型 '__NSDictionaryM' (0x1055952b0) 的值转换为 'NSString' (0x1023e3c60)

iOS - 删除 Recurring EKEvent,事件再次出现

multithreading - 如何将纤维传递给线程?