Comment puis-je exécuter un process sans bloquer l'interface user dans mon application iphone

J'accède à la photothèque sur l'iphone et il faut beaucoup de time pour importer les images que je sélectionne dans mon application, comment exécuter le process sur un thread secondaire, ou quelle solution puis-je utiliser pour ne pas bloquer l'interface user?

J'ai fait une explication complète avec un exemple de code en utilisant performSelectOnBackground ou GCD ici:

GCD, Threads, stream de programme et mise à jour de l'interface user

Voici l'exemple de partie de code de ce post (less ses problèmes spécifiques:

Exemple avec performSelectorInBackground:

Dans cet extrait, j'ai un button qui invoque le long travail en cours, une label de statut, et j'ai ajouté un slider pour montrer que je peux déplacer le slider pendant que le travail de bg est fait.

// on click of button - (IBAction)doWork:(id)sender { [[self feedbackLabel] setText:@"Working ..."]; [[self doWorkButton] setEnabled:NO]; [self performSelectorInBackground:@selector(performLongRunningWork:) withObject:nil]; } - (void)performLongRunningWork:(id)obj { // simulate 5 seconds of work // I added a slider to the form - I can slide it back and forth during the 5 sec. sleep(5); [self performSelectorOnMainThread:@selector(workDone:) withObject:nil waitUntilDone:YES]; } - (void)workDone:(id)obj { [[self feedbackLabel] setText:@"Done ..."]; [[self doWorkButton] setEnabled:YES]; } 

Échantillon de GCD:

 // on click of button - (IBAction)doWork:(id)sender { [[self feedbackLabel] setText:@"Working ..."]; [[self doWorkButton] setEnabled:NO]; // async queue for bg work // main queue for updating ui on main thread dispatch_queue_t queue = dispatch_queue_create("com.sample", 0); dispatch_queue_t main = dispatch_get_main_queue(); // do the long running work in bg async queue // within that, call to update UI on main thread. dispatch_async(queue, ^{ [self performLongRunningWork]; dispatch_async(main, ^{ [self workDone]; }); }); } - (void)performLongRunningWork { // simulate 5 seconds of work // I added a slider to the form - I can slide it back and forth during the 5 sec. sleep(5); } - (void)workDone { [[self feedbackLabel] setText:@"Done ..."]; [[self doWorkButton] setEnabled:YES]; } 

Utilisez une connection asynchronous. Il ne bloquera pas l'interface user pendant qu'il récupère derrière.

Cela m'a beaucoup aidé quand j'ai dû download des images, beaucoup d'entre eux.

Une option est d'utiliser performSelectorInBackground:withObject: