Создание UIImagePickerController зависает на несколько секунд - PullRequest
2 голосов
/ 22 сентября 2010

Я пытаюсь показать UIImagePickerController после нажатия кнопки в UIActionSheet.Код прост.Однако вызов [[UIImagePickerController alloc] init] висит на несколько секунд до его завершения.Я не вижу такого поведения в симуляторе, но вижу его на iPod и iPhone.

Вот методы UIActionSheetDelegate.Сообщения журнала были добавлены для отображения времени выполнения.

- (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
    NSLog(@"Action sheet clicked button at index %d", buttonIndex);
    switch (buttonIndex) {
        case kSelectFromCameraButtonIndex:
            [self showImagePickerWithCamera];
            break;
        case kSelectFromPhotoLibraryButtonIndex:
            [self showImagePickerWithPhotoLibrary];
            break;
    }
}

- (void)actionSheet:(UIActionSheet *)actionSheet willDismissWithButtonIndex:(NSInteger)buttonIndex {
    NSLog(@"Action sheet will dismiss with button index %d", buttonIndex);
}

- (void)actionSheet:(UIActionSheet *)actionSheet didDismissWithButtonIndex:(NSInteger)buttonIndex {
    NSLog(@"Action sheet did dismiss with button index %d", buttonIndex);
}

А вот код, который фактически создает UIImagePickerController:

- (void)showImagePickerWithPhotoLibrary {
    NSLog(@"Showing image picker with photo library");
    if ([UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypePhotoLibrary]) {

        NSLog(@"Creating picker");
        UIImagePickerController *picker = [[UIImagePickerController alloc] init];

        NSLog(@"Setting picker settings");
        picker.delegate = self;
        picker.allowsEditing = YES;
        picker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;

        NSLog(@"Presenting picker as modal view controller");
        [self presentModalViewController:picker animated:YES];

        NSLog(@"Releasing picker");
        [picker release];
    }
}

Ничего особенного не происходит.Однако, если вы посмотрите на вывод консоли, вы заметите, что для завершения строки, в которой создается UIImagePickerController, требуется около 7 секунд .

2010-09-21 15:23:26.107 Oh Snap[1264:307] Action sheet clicked button at index 1
2010-09-21 15:23:26.113 Oh Snap[1264:307] Showing image picker with photo library
2010-09-21 15:23:26.120 Oh Snap[1264:307] Creating picker
2010-09-21 15:23:33.111 Oh Snap[1264:307] Setting picker settings
2010-09-21 15:23:33.123 Oh Snap[1264:307] Presenting picker as modal view controller
2010-09-21 15:23:33.136 Oh Snap[1264:307] Using two-stage rotation animation. To use the smoother single-stage animation, this application must remove two-stage method implementations.
2010-09-21 15:23:33.144 Oh Snap[1264:307] Using two-stage rotation animation is not supported when rotating more than one view controller or view controllers not the window delegate
2010-09-21 15:23:33.289 Oh Snap[1264:307] Releasing picker
2010-09-21 15:23:33.299 Oh Snap[1264:307] Action sheet will dismiss with button index 1
2010-09-21 15:23:33.916 Oh Snap[1264:307] Action sheet did dismiss with button index 1

Кто-нибудь знает, что вызывает это?

Ответы [ 2 ]

2 голосов
/ 22 сентября 2010

Я заметил в своих приложениях, что создание UIImagePickerController занимает много времени.Обходной путь - создать его экземпляр до того, как он вам понадобится, даже в отдельном потоке, а затем представить его позже, когда это потребуется.Я полагаю, но не могу подтвердить, что именно так Apple делает это достаточно быстро.

0 голосов
/ 16 сентября 2011

Обратите внимание, что эта задержка, похоже, происходит только на iPhone 4: на iPod Touch того же поколения это не такая большая проблема.

Я использую NSOperation для создания экземпляра средства выбора изображений в фоновом режиме. Методы показа / скрытия счетчика добавляют / удаляют UIActivityIndicatorView из представления изображения, в котором я показываю изображение с камеры.

  NSOperationQueue *operations = ...

  ...

  [self showSpinner];

  [operations addOperation: 
    [NSBlockOperation blockOperationWithBlock: 
     ^{
        UIImagePickerController *cameraUI = [UIImagePickerController new];

        cameraUI.sourceType = UIImagePickerControllerSourceTypeCamera;
        cameraUI.allowsEditing = NO;
        cameraUI.delegate = self;

        [self performSelectorOnMainThread: @selector (showImagePicker:) 
                               withObject: cameraUI waitUntilDone: YES];
     }]];

  ...


 - (void) showImagePicker: (UIImagePickerController *) picker
 {
   [self hideSpinner];
   [self presentModalViewController: picker animated: YES];
 }
...