【问题标题】:UIImagePickerController really slow when calling alloc initUIImagePickerController 在调用 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。

【问题讨论】:

  • 你试过不同的设备吗?
  • 是的,尝试过不同的设备 - 所有设备都出现同样的问题

标签: ios objective-c performance uiimagepickercontroller


【解决方案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; } }
猜你喜欢
  • 1970-01-01
  • 2014-02-20
  • 1970-01-01
  • 2013-01-16
  • 1970-01-01
  • 1970-01-01
  • 2012-07-16
  • 1970-01-01
  • 2017-11-10
相关资源
最近更新 更多