didFinishPickingMediaWithInfo是否在后台线程中被调用?

时间:2017-09-28 10:07:10

标签: ios uikit uiimagepickercontroller grand-central-dispatch ios-multithreading

我认为在主线程中调用UIImagePickerController委托方法(或任何UIKit委托方法)。但是在这里,当从图库或摄像头中选择图像时,didFinishPickingMediaWithInfo方法似乎没有被调用,并且必须在主线程上调用UIKit委托方法吗?显式调度到主线程有效。 Apple文档中也没有提到这一点。

-(void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary<NSString* ,id> *)info{

    uploadImage = info[UIImagePickerControllerOriginalImage]; // Set selected image            
    dispatch_async(dispatch_get_main_queue(), ^{
        [self.leftButton setImage:[UIImage imageNamed:@"image_attach.png"]
                         forState:UIControlStateNormal];
    });

    // The following does not work.
    //[self.leftButton setImage:[UIImage imageNamed:@"image_attach.png"]
                     //forState:UIControlStateNormal];  
}

底线,是否在主线程上调用所有UIKit委托方法?或者有些人在非主线程中被调用?为什么这种不一致我们认为没有必要将我们的代码发送到主线程,但最终这样做会使事情有效?如果有人知道答案请澄清。

修改 正如Rob所建议的那样,我检查了这个方法[NSThread isMainThread],以查看代码执行的线程。它清楚地返回true以确认我在主线程中,但奇怪的是没有明确地将我的setImage方法分派给主队列,代码不起作用。此外,我尝试将我的代码移动到选择器的dismiss方法的完成处理程序,瞧它没有明确的主线程块!

仍然混淆为什么这样做......

1 个答案:

答案 0 :(得分:1)

当我测试它时,它在主线程上被调用。我建议您检查[NSThread isMainThread]以确认(或者,在Swift中,dispatchPrecondition(condition: .onQueue(.main))Thread.isMainThread)。在我的测试中,它是在主线程上。

如果它不是主线程(!),我会检查你提供它的位置,以确保你从主线程中显示它。

我无法想到在后台线程上调用的任何与UI相关的委托方法。对于非UI委托方法,有很多不使用主线程,但像这样的以UI为中心的API使用主线程。