我需要一些关于如何在10.6下的Cocoa中调试并发问题的指导。我正在转换一个'for‘循环来使用NSOperations,但大多数时候,代码只是在循环中的某个点冻结。我可以在控制台中看到这方面的NSLog输出。在极少数情况下,代码会一直运行下去,这是很好的。
该代码仅为模型层,从控制器中的方法启动。该方法仅循环8-10个模型对象,指示每个对象将其输出写入唯一命名的文件。8个模型对象=8个单独的文件。没有对图形用户界面的调用,模型对象是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];
}];
}我做了很多NSLogs,这会是问题所在吗?后台线程的NSLog是不是一件坏事?
因为我是从块内部添加到可变数组中的,所以我将可变数组声明为__block是否正确?这两种方法我都试过了,似乎和这个冻结问题没有什么区别。
如何使用Xcode v4调试此问题?我想知道它冻结在哪一行代码上,或者是哪两行代码同时执行并导致它阻塞执行。由于并发性,我以前设置单个断点和遍历代码的技术不再有效。
谢谢
发布于 2011-03-16 08:52:46
这与你的块范围的变量无关。您的问题是NSMutableArray和NSManagedObject都不是以任何方式、形状或窗体线程安全的。你不能做你在这里做的事。如果您希望在主线程之外处理此事件,则需要使用分派队列或类似的方法来连续处理每个项(即使您回到主线程上,也应该在读取可变数组之前使用相同的队列。然而,可能更容易和更安全的做法是,在完成后将可变数组复制到不可变版本,然后向嵌入了新的不可变副本的主线程发送通知或回调。
https://stackoverflow.com/questions/5319673
复制相似问题