【问题标题】:Debugging NSOperationQueue Blocking调试 NSOperationQueue 阻塞
【发布时间】:2011-03-16 00:27:04
【问题描述】:

我需要一些指导,了解如何在 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];
    }];
}

我做了很多 NSLogs,这会是问题吗?来自后台线程的 NSLog'ing 是一件坏事吗?

由于我是从块内部添加到可变数组中,所以我将可变数组声明为 __block 是否正确?我已经尝试了两种方法,似乎与这个冻结问题没有区别。

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

谢谢

【问题讨论】:

    标签: cocoa debugging concurrency xcode4 nsoperationqueue


    【解决方案1】:

    这与您的块范围变量无关。你的问题是NSMutableArrayNSManagedObject 都不是线程安全的。你不能在这里做你正在做的事情。如果你想从主线程处理这个,你需要使用调度队列或类似的东西来串行处理每个项目(即使你回到主线程,你应该在读取之前使用同一个队列你的可变数组。但是,完成后将可变数组复制到不可变版本,然后使用新的不可变数组向主线程发送通知或回调可能会更容易和更安全复制嵌入。

    【讨论】:

    猜你喜欢
    • 2015-04-24
    • 2013-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-16
    • 2019-04-10
    • 2014-03-23
    • 1970-01-01
    相关资源
    最近更新 更多