首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调试NSOperationQueue阻塞

调试NSOperationQueue阻塞
EN

Stack Overflow用户
提问于 2011-03-16 08:27:04
回答 1查看 606关注 0票数 0

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

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

代码:

代码语言:javascript
复制
__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调试此问题?我想知道它冻结在哪一行代码上,或者是哪两行代码同时执行并导致它阻塞执行。由于并发性,我以前设置单个断点和遍历代码的技术不再有效。

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-03-16 08:52:46

这与你的块范围的变量无关。您的问题是NSMutableArrayNSManagedObject都不是以任何方式、形状或窗体线程安全的。你不能做你在这里做的事。如果您希望在主线程之外处理此事件,则需要使用分派队列或类似的方法来连续处理每个项(即使您回到主线程上,也应该在读取可变数组之前使用相同的队列。然而,可能更容易和更安全的做法是,在完成后将可变数组复制到不可变版本,然后向嵌入了新的不可变副本的主线程发送通知或回调。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5319673

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档