0

J'ai un UIScrollView avec pagination activée et je veux montrer quelques "pages" avec des images.Comportement étrange de dispatch_get_main_queue

Je charge des images de la première page dans un fil principal et je l'affiche. Alors je commence le chargement d'autres images pages dans un thread d'arrière-plan

dispatch_async(loadingImagesQueue, ^{ 
      for (int i = 0; i < numberOfImages; i++) { 
       NSString *imagePath = [arrayWithImagePaths objectAtIndex:i]; 
       UIImage *image = [UIImage imageWithContentsOfFile:imagePath]; 

       dispatch_async(dispatch_get_main_queue(), ^{ 
         NSLog(@"Posting notification\n\n"); 
         [[NSNotificationCenter defaultCenter] postNotificationName:NOTIFICATION_NAME_IMAGE_PREPARED object:image]; 
       }); 
      } 
    }); 

Après notification affichant un certain appel de méthode, sorcière crée une nouvelle page avec l'image chargée. J'ai mis des messages de journal dans mon image de chargement et de créer de nouvelles méthodes de page, et je m'attends à ce qu'il ressemble à un message sur le chargement de l'image, puis un message sur la création d'une nouvelle page. Mais, pour une raison quelconque, il charge d'abord toutes les images, et seulement après cela, il commence à créer de nouvelles pages. Je peux le voir par mes messages de journal. Et la chose la plus étrange qu'il ya un grand retard (environ 0,5 seconde) entre la fin du chargement de la dernière image et commencer à créer une nouvelle page.

Quelqu'un peut-il expliquer, quelle est la raison de ce comportement étrange?

Répondre

1

Vous appelez dispatch_async. Si vous souhaitez effectuer la notification à ce moment-là dans la file d'attente principale, appelez dispatch_sync(dispatch_get_main_queue(), ^{ .... Et assurez-vous de vérifier que vous n'êtes pas déjà sur le fil principal lorsque vous envoyez quoi que ce soit dans la file d'attente principale (ici, vous êtes pratiquement sûr, mais c'est généralement une bonne pratique, sinon vous risquez de rencontrer un verrou).

donc le code complet serait

if([NSThread isMainThread] == NO){ dispatch_sync(dispatch_get_main_queue(), {....

+0

Merci pour votre réponse. Comme je le sais, la seule différence entre dispatch_async et dispatch_sync est que dispatch_sync fait que bg thread attend le résultat de l'exécution du bloc, alors que dispatch_async permettra à bg thread de s'exécuter en même temps. Donc les deux devraient courir à ce moment-là. – tagirkaZ

+1

La chose à propos de dispatch_async est qu'il n'exécutera pas le bloc dans la file d'attente que vous avez spécifié mais ENQUEUE il. C'est pourquoi vous obtenez des résultats étranges. Les blocs sont mis en file d'attente dans le thread principal, et vous n'êtes pas sûr quand ils vont s'exécuter. – Mercurial