Cocoa 调试NSOperationQueue阻塞

Cocoa 调试NSOperationQueue阻塞,cocoa,debugging,concurrency,xcode4,nsoperationqueue,Cocoa,Debugging,Concurrency,Xcode4,Nsoperationqueue,我需要一些关于如何在10.6下的Cocoa中调试并发问题的指导。我正在将“for”循环转换为使用NSO操作,但大多数时候,代码只是在循环的某个点冻结。我可以在控制台中看到NSLog输出。在极少数情况下,代码会一直运行,而且不会有问题 代码仅为模型层,由控制器中的方法启动。该方法只循环8-10个模型对象,指示它们将各自的输出写入唯一命名的文件。8个模型对象=8个单独的文件。没有对GUI的调用,模型对象是NSManagedObject子类,其中包含一组子NSManagedObject对象(其中0..

我需要一些关于如何在10.6下的Cocoa中调试并发问题的指导。我正在将“for”循环转换为使用NSO操作,但大多数时候,代码只是在循环的某个点冻结。我可以在控制台中看到NSLog输出。在极少数情况下,代码会一直运行,而且不会有问题

代码仅为模型层,由控制器中的方法启动。该方法只循环8-10个模型对象,指示它们将各自的输出写入唯一命名的文件。8个模型对象=8个单独的文件。没有对GUI的调用,模型对象是NSManagedObject子类,其中包含一组子NSManagedObject对象(其中0..n个),每个拥有该对象的对象汇总并写出。输出格式为JSON

代码:

我做了很多NSlog,这是问题吗?从后台线程登录是件坏事吗

因为我是从块内部添加到可变数组的,所以我将可变数组声明为_块是否正确?我试过两种方法,但在这个冰冻问题上似乎没有什么不同

如何使用Xcode v4调试此问题?我想知道它冻结在哪一行代码上,或者哪两行代码同时执行并导致它阻止执行。。由于并发性,我以前设置单个断点并单步执行代码的技术不再有效


谢谢

这与块作用域变量无关。您的问题是,无论是
NSMutableArray
还是
NSManagedObject
都不是线程安全的。你不能做你在这里做的事。如果您希望在主线程之外处理此项,则需要使用分派队列或类似的方法来串行处理每个项(即使回到主线程,在读取可变数组之前也应该使用相同的队列。但是,如果在完成后将可变数组复制到不可变版本,然后使用新的不可变副本emb向主线程发送通知或回调,可能会更容易、更安全EDED。

这与块作用域变量无关。您的问题是
NSMutableArray
NSManagedObject
都不是以任何方式、形状或形式线程安全的。您无法在此处执行此操作。如果您希望在主线程之外处理此操作,则需要使用调度队列或类似于按顺序处理每个项目(即使回到主线程,在读取可变数组之前也应该使用相同的队列。但是,如果在完成后将可变数组复制到不可变版本,然后使用新的不可变副本emb向主线程发送通知或回调,可能会更容易、更安全Eded.

将后续问题作为新文章重新编写并发布。将后续问题作为新文章重新编写并发布。
__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];
    }];
}