ios - UIImagePickerController 只能在主线程中使用 | 应用程序崩溃
问题描述
大家好,我UIImagePickerController
在iOS 14中实现。当用户选择相机时,当用户同意使用相机时,我的应用程序崩溃,在 xcode 上以紫色返回此错误
- [UIImagePickerController init] must be used from main thread only
我怎么解决这个问题?感谢大家的建议
private func cameraAuth(auth sourceType: UIImagePickerController.SourceType) {
switch AVCaptureDevice.authorizationStatus(for: .video) {
case .denied: imagePickerAuthDenied()
case .restricted: imagePickerAuthRestricted()
case .authorized: showImagePicker(sourceType: sourceType)
case .notDetermined:
AVCaptureDevice.requestAccess(for: .video) { (success) in
if success { self.showImagePicker(sourceType: sourceType) }
else { self.imagePickerAuthDenied() }
}
default : print("Default Switch Camera Auth")
}
}
private func showImagePicker(sourceType: UIImagePickerController.SourceType) {
let imagePickerController = UIImagePickerController()
imagePickerController.delegate = self
imagePickerController.sourceType = sourceType
imagePickerController.allowsEditing = true
present(imagePickerController, animated: true, completion: nil)
}
解决方案
您需要将代码包装authorizationStatus/AVCaptureDevice.requestAccess(for: .video) { (success) in
在 DispatchQueue.main.async
AVCaptureDevice.authorizationStatus(for: .video) {
DispatchQueue.main.async {
///
}
}
AVCaptureDevice.requestAccess(for: .video) { (success) in
DispatchQueue.main.async {
///
}
}
推荐阅读
- android - 如何从活动中调用片段?
- postgresql - Postgres 使用 date_part 扩展时间窗口
- java - 在 Java 中从逗号分隔的字符串创建枚举列表
- java - guice 注射器使用的最佳实践
- coordinates - Power BI - 根据 Lat/Lng 查找最近的位置
- delphi - 如何避免在 Delphi10 中使用 TeeChart Pro 2017 更改图表的背景颜色?
- java - ForkJoinTask:join() 的顺序
- javascript - 如何在javascript中将GMT时间转换为IST时间
- ruby-on-rails - 我正在尝试通过 rails 迁移数据库,并且存在错误表后的抛出
- ios - 检查 Swift 4 中的本地文件大小