UIImagePickerController ne montre pas (prendre plus de time à charger) aperçu de la camera dans ios7

J'utilise GCD dans mon application pour récupérer beaucoup d'images et de données dans la queue d'arrière-plan et quand je présente uiimagepickercontroller, il faut plus de time pour montrer l'aperçu de la camera. Après avoir parcouru Google, j'ai constaté que beaucoup d'entre eux ont été confrontés à ce problème avec iOS 7 et voici un autre post qui m'a semblé logique. ( iOS 7 UIImagePickerController Camera Pas d'image ). La solution consistait à arrêter les threads d'arrière-plan et à présenter le controller du sélecteur. Mais je suis vraiment perplexe et je ne sais pas comment arrêter ou mettre en pause les fils d'arrière-plan, présenter le controller du sélecteur, puis reprendre / démarrer le fil d'arrière-plan. Quelqu'un pourrait m'aider avec ça.

Voici comment je fais mes searchs d'arrière-plan d'images et de données dans ma class de networking (comme tout le monde). Ma queue série est initialisée comme ceci.

sharedInstance.serialQueue = dispatch_queue_create("user-detail-queue", DISPATCH_QUEUE_CONCURRENT); 

Et le code pour aller chercher les choses en arrière-plan est comme ça.

  dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0), ^{ NSSsortingng *myUserID = [JNKeychain loadValueForKey:@"userID"]; NSSsortingng *sessionToken = [JNKeychain loadValueForKey:@"sessionToken"]; if(sessionToken && myUserID) { dispatch_async([BGNetworkAPI sharedInstance].serialQueue, ^{ id object = [[BGNetworkAPI sharedInstance].userCache objectForKey:myUserID]; if(object) { NSDictionary *cachedResponseDictionary = (NSDictionary *)object; BGUser *user = [BGUser createUserWithResponseDictionary:cachedResponseDictionary]; if(block) { block(user, nil); } } else { [[BGUserManagementClient sharedClient] fetchUserDetailsWithUserId:myUserID withSessionToken:sessionToken withSuccessBlock:^(AFHTTPRequestOperation *operation, id responseObject) { //NSLog(@"The response object of my user object is %@",responseObject); [[BGNetworkAPI sharedInstance].userCache setObject:responseObject forKey:myUserID]; NSDictionary *responseDictionary = (NSDictionary *)responseObject; BGUser *user = [BGUser createUserWithResponseDictionary:responseDictionary]; if(block) { block(user,nil); } } failure:^(AFHTTPRequestOperation *operation, NSError *error) { NSLog(@"The error while fetching the user details is %@", operation.responseObject); if(block) { block(nil, error); } }]; } } }); 

Avec le code ci-dessus, vous n'effectuez pas la récupération dans le backgroud car dispatch_get_main_queue() vous donne la queue sur laquelle l'interface s'exécute. Pour effectuer une extraction d'arrière-plan, vous devez ouvrir une autre queue avec dispatch_queue_create("image_queue", NULL) .

Lorsque le backgroud fetch est terminé et que vous voulez faire quelque chose avec l'interface user, vous devez le faire dans la queue principale.

 dispatch_async(dispatch_get_main_queue(),^{ if(block) { block(user,nil) } }); 

Après avoir joué avec le code, j'ai compris le problème. Dans tous les endroits où je fais des searchs d'arrière-plan, j'envoyais le bloc d'achèvement juste comme ça. Lorsque j'ai changé le return du bloc d'achèvement dans le bloc principal, il a commencé à fonctionner correctement. Merci beaucoup à @HackingOther de souligner mon erreur.