2010-09-21 4 views
2

J'essaie d'afficher un UIImagePickerController après avoir cliqué sur un bouton dans une UIActionSheet. Le code est simple. Cependant, l'appel à [[UIImagePickerController alloc] init] est suspendu pour plusieurs secondes avant qu'il ne se termine. Je ne vois pas ce comportement dans le simulateur, mais je le vois sur un iPod et un iPhone.La création de UIImagePickerController se bloque pendant plusieurs secondes

Voici les méthodes UIActionSheetDelegate. Les messages du journal ont été ajoutés pour afficher les temps d'exécution.

- (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); 
} 

Et voici le code qui crée en fait le 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]; 
    } 
} 

Rien d'extraordinaire se passe. Cependant, si vous regardez la sortie de la console, vous remarquerez que la ligne où le UIImagePickerController est créé prend environ 7 secondes pour terminer.

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 

Quelqu'un sait ce qui cause cela?

+0

Avez-vous trouvé une solution? Merci ! –

Répondre

2

J'ai remarqué dans mes applications que UIImagePickerController met beaucoup de temps à créer. Une solution de contournement consiste à l'instancier avant que vous en ayez besoin, même sur un thread séparé, puis à le présenter plus tard lorsque cela est nécessaire. Je suppose, mais je ne peux pas confirmer que c'est ainsi que Apple le fait monter assez vite.

+1

Ceci est légèrement déconcertant, et n'est certainement pas un comportement documenté. Est-ce que d'autres personnes ont aussi rencontré ça? Il semble que ce soit digne d'un rapport de bug avec Apple si c'est effectivement le cas. – pmc255

0

Notez que ce délai ne semble se produire que sur l'iPhone 4: sur l'iPod Touch de la même génération, ce n'est pas aussi grave.

J'utilise une NSOperation pour instancier l'instance du sélecteur d'images en arrière-plan. Les méthodes show/hide spinner ajoutent/suppriment un UIActivityIndicatorView de la vue de l'image Je montre l'image de la caméra.

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]; 
} 
Questions connexes