调试NSOperationQueue阻塞

时间:2011-03-16 00:27:04

标签: cocoa debugging concurrency xcode4 nsoperationqueue

我需要一些指导如何在10.6下的Cocoa中调试并发问题。我正在转换'for'循环来使用NSOperations,但大多数时候,代码只是在循环中的某个时刻冻结。我可以在控制台中看到NSLog输出。在极少数情况下,代码将一直运行并且没问题。

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

代码:

__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];
    }];
}

我做了很多NSLog,这会是问题吗? NSLog的后台线程是坏事吗?

由于我是从一个块中添加可变数组,所以我将可变数组声明为__block是否正确?我已经尝试了两种方式,看起来没有任何关于这个冻结问题的区别。

如何使用Xcode v4调试此问题?我想知道它正在冻结的代码行,或者两行代码同时执行并导致它阻止执行。我以前设置单个断点并单步执行代码的技术不再起作用,因为并发。

感谢

1 个答案:

答案 0 :(得分:3)

这与块作用域变量无关。您的问题是NSMutableArrayNSManagedObject都不以任何方式,形状或形成线程安全。你不能做你在这里做的事情。如果你想要从主线程中处理这个,你需要使用一个调度队列或类似的东西来串行处理每个项目(即使你回到主线程,你应该在读取之前使用相同的队列你的可变数组。然而,在完成后将可变数组复制到不可变版本,然后使用new,immutable调度通知或回调到主线程,可能会更简单,更安全。复制嵌入式。