Ours avec moi, ça va prendre un peu difficile à expliquer. J'ai une fonction qui ressemble à celui ci-dessous.
Contexte: "unprojeter" est une Base de Données de l'entité nommée LPProject avec un tableau nommé "memberFiles' qui contient des instances d'une autre Base de Données de l'entité appelée LPFile. Chaque LPFile représente un fichier sur le disque et ce que nous voulons faire est d'ouvrir chacun de ces fichiers et de les analyser son texte, à la recherche de @déclarations d'importation qui pointent vers d'AUTRES fichiers. Si nous trouvons @déclarations d'importation, nous voulons localiser le fichier qu'ils indiquent et puis "lien" qui fichier à celle-ci par l'ajout d'une relation de la base de données de l'entité qui représente le premier fichier. Depuis tout cela peut prendre un certain temps sur de gros fichiers, nous allons le faire à la sortie de l'thread à l'aide de PGCD.
- (void) establishImportLinksForFilesInProject:(LPProject *)aProject {
dispatch_queue_t taskQ = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
for (LPFile *fileToCheck in aProject.memberFiles) {
if (//Some condition is met) {
dispatch_async(taskQ, ^{
// Here, we do the scanning for @import statements.
// When we find a valid one, we put the whole path to the imported file into an array called 'verifiedImports'.
// go back to the main thread and update the model (Core Data is not thread-safe.)
dispatch_sync(dispatch_get_main_queue(), ^{
NSLog(@"Got to main thread.");
for (NSString *import in verifiedImports) {
// Add the relationship to Core Data LPFile entity.
}
});//end block
});//end block
}
}
}
Maintenant, voici où les choses deviennent étranges:
Ce code fonctionne, mais je vais voir un étrange problème. Si je l'exécute sur un LPProject qui a quelques fichiers (environ 20), il fonctionne parfaitement. Cependant, si je le lance sur un LPProject qui a plus de fichiers (par exemple, de 60 à 70), elle ne peut PAS s'exécuter correctement. Nous n'avons jamais revenir au thread principal, l' NSLog(@"got to main thread");
n'apparaît jamais, et l'application se bloque. MAIS, (et c'est là que les choses deviennent VRAIMENT bizarre) --- si j'exécute le code sur le petit projet d'ABORD et ENSUITE l'exécuter sur le grand projet, tout fonctionne parfaitement. C'est SEULEMENT lorsque j'exécute le code sur le grand projet d'abord que le problème se présente.
Et voici le kicker, si je change la deuxième expédition de la ligne:
dispatch_async(dispatch_get_main_queue(), ^{
(C'est à dire d'utiliser async
au lieu de sync
de l'envoi de ce bloc à la file d'attente principale), tout fonctionne tout le temps. Parfaitement. Quel que soit le nombre de fichiers dans un projet!
Je suis à une perte pour expliquer ce comportement. Toute aide ou des conseils sur ce qu'à tester la prochaine serait appréciée.