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