2011-03-16 2 views
0

J'ai besoin de conseils sur la façon de déboguer les problèmes de concurrence dans Cocoa sous 10.6. Je convertis une boucle 'for' pour utiliser NSOperations mais la plupart du temps, le code gèle à un certain point de la boucle. Je peux voir la sortie de NSLog dans la console à cet effet. En de rares occasions, le code fonctionnera tout le long et c'est très bien.Débogage du blocage NSOperationQueue

Le code est une couche modèle uniquement, lancée à partir d'une méthode dans le contrôleur. La méthode parcourt uniquement 8 à 10 objets de modèle, en leur demandant d'écrire leur sortie dans un fichier nommé de manière unique. 8 objets modèles = 8 fichiers distincts. Il n'y a pas d'appel jusqu'à l'interface graphique et les objets modèles sont des sous-classes NSManagedObject, qui contiennent un ensemble d'objets enfants NSManagedObject (0 ... n), que chaque objet propriétaire résume et écrit. Le format de sortie est JSON.

code:

__block NSMutableArray *collectionOfCourses = [[NSMutableArray alloc] initWithCapacity:[[self courses] count]]; 

/* Create a filename. Use our title and set it to lowercase */ 
NSURL *ourFileURL = [aURL URLByAppendingPathComponent:[[self title] lowercaseString]]; 
ourFileURL = [ourFileURL URLByAppendingPathExtension:@"js"]; 

for (Course *aCourse in [self courses]) { 
     [[self opQueue] addOperationWithBlock:^{ 
     NSArray *arrayForOneCourse = [aCourse arrayAndWriteToFileURL:aURL fileFormat:format]; 
    [collectionOfCourses addObject:arrayForOneCourse]; 
    }]; 
} 

Je fais beaucoup de NSLogs, serait-ce la question? NSLog'ing de threads d'arrière-plan est une mauvaise chose?

Puisque j'ajoute au tableau mutable de à l'intérieur d'un bloc, est-il correct que je déclare le tableau mutable comme __block? Je l'ai essayé dans les deux sens et apparemment aucune différence liée à ce problème de gel. Comment puis-je déboguer ce problème en utilisant Xcode v4?

Je veux connaître la ligne de code sur laquelle il gèle, ou quelles sont les deux lignes de code qui s'exécutent en même temps et qui bloquent l'exécution. Mes anciennes techniques de définition d'un seul point d'arrêt et de progression dans le code ne fonctionnent plus , à cause de la concurrence.

grâce

Répondre

3

Il n'y a rien à voir avec votre variable scope bloc. Votre problème est que ni NSMutableArray ni NSManagedObject ne sont d'une manière ou d'une autre compatibles avec le filetage. Vous ne pouvez pas faire ce que vous faites ici. Si vous voulez que cela soit traité par le thread principal, vous devez utiliser une file d'attente ou quelque chose de similaire pour traiter chaque élément en série (et même lorsque vous êtes de retour sur le thread principal, vous devez utiliser cette même file d'attente Il serait probablement plus facile et plus sûr, cependant, de faire quelque chose comme copier le tableau mutable dans une version immuable lorsque vous avez terminé, puis envoyer une notification ou rappel au thread principal avec le nouveau, immuable copie incorporée

+0

retravaillé et a posté une question de suivi dans un nouvel article http://stackoverflow.com/questions/5363312/how-to-ensure-tasks-have-completed – Woodster