uikit方法是否保证在主线程上运行?

use*_*620 1 objective-c grand-central-dispatch ios

任何与UI相关的工作都需要在iOS主线程上运行.有时我们需要做一些异步工作,比如下载一个图像,我们可能会使用dispatch_async,当下载完成时,我们得到主线程并显示如下:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
UIImage *overlayImage = [self faceOverlayImageFromImage:_image];
dispatch_async(dispatch_get_main_queue(), ^{
    [self fadeInNewImage:overlayImage];
});
Run Code Online (Sandbox Code Playgroud)

});}

但是当我们在本地加载图像时,我们通常只是在不调度主线程的情况下执行此操作:

UIImageView *imageView = [[UIImageView alloc] initWithImage:@"myimage.png"];
Run Code Online (Sandbox Code Playgroud)

我的问题是他们保证在主线程上运行吗?如果是,我们为什么要使用dispatch_get_main_queue()发送它?如果没有,为什么我们不需要在主线程上发送每个ui相关的工作?

Dun*_*n C 6

你很困惑.

给定的调用链可以在主线程上运行,也可以在后台线程上运行.您处理的大多数代码都是通过系统事件调用的,并保证在主线程上运行.只有有限数量的情况会从后台线程调用您的代码.只有在这些情况下,您才需要在将调用重定向到主线程的代码中包装UIKit调用.

始终在主线程上调用视图控制器功能,按钮操作等.如果系统在后台线程上调用某个方法,则会对其进行详细记录.

一些采用完成处理程序的函数在后台线程上调用这些完成处理程序.在NSURLSession(URLSession)类,例如,调用在一个委托队列默认为一个后台线程其完成处理程序和委托方法.因此,当您将完成处理程序传递给实例时URLSession,您需要确保您的UIKit代码包含在对dispatch_async()(DispatchQueue.main.async()在Swift 3中)的调用或将代码传递给主线程以执行的类似方法中.