相机权限请求时,未在主线程的bug

问题:

在调用相机时,进行了权限请求,发生了Crash。

原因:

在相机权限请求回调中,不在主线程,故唤起UIImagePickerController时发生崩溃。

分析:

1、相机的权限请求
  [AVCaptureDevice requestAccessForMediaType:AVMediaTypeVideo completionHandler:^(BOOL granted) {
  //The completion handler is called on an arbitrary dispatch queue. 
//It is the client's responsibility to ensure that any UIKit-related updates are called on the main queue or main thread as a result.
//意思是:completionHandler会在任意队列上执行,我们要确保在主线程中执行。
}

But,为什么测试没有测出来?因为在已经授权时,这个handler会在主线程中执行;

那相册权限呢?
2、相册权限请求
[PHPhotoLibrary requestAuthorization:^(PHAuthorizationStatus status) {
//Photos may call your handler block on an arbitrary serial queue. 
//If your handler needs to interact with UI elements, dispatch such work to the main queue.
//在官方api中的note叙述如上,可知,与相机类似。
 }];

解决:

很简单了,在回掉中,切到主线程中。
PS:附带三种回主线程的方法。
参考:https://blog.csdn.net/cordova/article/details/54933729

// 1.NSThread
[self performSelectorOnMainThread:@selector(updateUI) withObject:nil waitUntilDone:NO];

- (void)updateUI {
}

// 2.NSOperationQueue
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
}];

// 3.GCD
dispatch_async(dispatch_get_main_queue(), ^{
});
上一篇:python – 有没有办法将函数存储在列表或字典中,以便在调用索引(或键)时触发存储的函数?


下一篇:Flask快速入门(4) — CBV写法与解析