3 votes

iPhone - Grand Central Dispatch ne fonctionne pas correctement sur l'iPhone 4S

J'ai une application que j'ai créée pour l'iPhone 4 lorsqu'il a été lancé. Maintenant, cette application ne fonctionne pas sur l'iPhone 4S.

J'ai identifié la section coupable comme étant une pièce GCD. La voici :

dispatch_group_t my_group = dispatch_group_create();

dispatch_queue_t queue1 = 
        dispatch_queue_create("Queue 1", NULL);

dispatch_queue_t queue2 = 
        dispatch_queue_create("Queue 2", NULL);

dispatch_group_async(my_group, queue1, ^{
        [self doStuff1];
});

dispatch_group_async(my_group, queue2, ^{
        [self doStuff2];
});

dispatch_group_notify(my_group, dispatch_get_main_queue(), ^{
 // this is block 3, this is to be executed after both queues end processing
 // this is never executed on iPhone 4S, but is executed on iPhone4
 // no error message, but execution never starts inside this block
});

L'idée est la suivante : deux files d'attente sont créées ainsi qu'un groupe. Je lance des tâches pour les deux files d'attente, de manière asynchrone, en utilisant le groupe. Lorsque les deux sont terminées, le groupe lance un autre bloc de tâches.

Cela fonctionne à merveille sur l'iPhone 4, mais le bloc final 3 n'est jamais atteint.

Une raison pour cela ? Des indices ?

Merci.

5voto

Jesse Rusak Points 33702

Peut-être doStuff1 y doStuff2 sont bloqués, ou quelque chose d'autre bloque le fil principal ? Le 4S possède plusieurs cœurs, contrairement au 4. Il se peut donc que vous rencontriez des problèmes de blocage multithreading que vous n'auriez pas vus auparavant.

Êtes-vous sûr que les deux blocs se terminent réellement et que le thread principal est disponible pour exécuter le bloc résultant ? Peut-être qu'un code complet (c'est-à-dire les corps de doStuff1 et 2) pourrait vous aider ?

2voto

jkh Points 2015

La première chose que je ferais serait de changer le code pour tout dispatcher_async sur la file d'attente 1 ; vous n'obtiendrez pas de concurrence, évidemment, mais vous saurez instantanément si dostuff1 et dostuff2 entrent en collision d'une manière ou d'une autre si le problème disparaît immédiatement. Sur une machine à un seul cœur, il s'agit probablement du comportement d'exécution que vous observiez auparavant.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X