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 上泄漏

UIImagePickerController 呈现在视图中

在 iOS 7 上显示 UIImagePickerController 会导致崩溃