UIImagePickerController 在调用 alloc init 时真的很慢
Posted
技术标签:
【中文标题】UIImagePickerController 在调用 alloc init 时真的很慢【英文标题】:UIImagePickerController really slow when calling alloc init 【发布时间】:2013-12-03 14:13:40 【问题描述】:我有一个视图控制器,它在按下 tabBarController 中的一个选项卡时显示。在这个视图控制器中,我在 viewDidLoad 方法中初始化了一个 UIImagePickerController:
- (void)viewDidLoad
[super viewDidLoad];
//Set imagePicker
//-------------------------//
_imagePicker = [[UIImagePickerController alloc] init];
_imagePicker.delegate = self;
_imagePicker.videoMaximumDuration = 10.0f;
目的是在稍后按下按钮时显示 UIImagePickerController。出于某种原因,当按下此视图控制器的选项卡图标时,此 viewDidLoad 方法正在运行时会挂起 3-4 秒。当我注释掉 _imagePicker = [[UIImagePickerController alloc] init] 行时,没有挂起时间,视图控制器会立即加载 - 应该如此。
有谁知道为什么分配和初始化 UIImagePickerController 需要这么长时间?如果是这样,除了将其作为后台进程运行之外,还有其他方法可以加快速度吗?这似乎不是正常行为。
我使用的是 ios7,我没有调用 viewWillAppear 或 viewDidAppear。
【问题讨论】:
你试过不同的设备吗? 是的,尝试过不同的设备 - 所有设备都出现同样的问题 【参考方案1】:事实证明,这只是在调试模式下(当 iPhone 连接并通过 Xcode 运行时)出现的问题。一旦相同的应用程序在没有连接到 Xcode 的情况下运行,就不会发生延迟。
【讨论】:
在弹出加载UIImagePickerController的popover时,无论XCode的调试模式如何,都太慢了。 这不应该是公认的答案。当您重新访问后续视图并调用它时,UIImagePickerController 的延迟时间会持续增长。最终应用程序会崩溃。特别是如果您有多个视图调用 UIImagePickerController。【参考方案2】:试试这个 iOS 12
//show a HUD or activityIndicator
dispatch_async(dispatch_queue_create("openPhotosCamera", NULL), ^
UIImagePickerController *mediaUI = [[UIImagePickerController alloc] init];
dispatch_async(dispatch_get_main_queue(), ^
//hide HUD or activityIndicator
[presenter presentViewController:mediaUI animated:YES completion:nil];
);
);
**presenter 是 yourViewController / self
【讨论】:
iOS 13 : [UIImagePickerController alloc] 不能在后台线程上调用。【参考方案3】:试试这个。
- (void)viewDidLoad
//Set imagePicker
//-------------------------//
_imagePicker = [[UIImagePickerController alloc] init];
_imagePicker.delegate = self;
_imagePicker.videoMaximumDuration = 10.0f;
[super viewDidLoad];
【讨论】:
这对延迟时间没有影响 试试这个UIImagePickerController *imagepicker; - (void)viewDidAppear:(BOOL)animated [super viewDidAppear:animated]; //show camera... if(!imagepicker) imagepicker = [[UIImagePickerController alloc]init]; imagepicker.sourceType = UIImagePickerControllerSourceTypeCamera;
以上是关于UIImagePickerController 在调用 alloc init 时真的很慢的主要内容,如果未能解决你的问题,请参考以下文章
在 iOS 7 中呈现 UIImagePickerController 的问题
如何在 iPad 上关闭 UIImagePickerController
仅在横向 UIImagePickerController 中显示CameraControls
UIImagePickerController 在 iOS 11 上泄漏