gpt4 book ai didi

cocoa - 调试 NSOperationQueue 阻塞

转载 作者:行者123 更新时间:2023-12-03 17:36:22 27 4
gpt4 key购买 nike

我需要一些关于如何调试 10.6 版本下的 Cocoa 并发问题的指导。我正在将“for”循环转换为使用 NSOperations,但大多数时候,代码只是在循环的某个时刻卡住。我可以在控制台中看到 NSLog 输出。在极少数情况下,代码会一直运行,这样就没有问题。

该代码仅是模型层的,由 Controller 中的方法启动。该方法仅循环访问 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'ing 是一件坏事吗?

由于我从 block 内添加到可变数组,因此将可变数组声明为 __block 是否正确?我已经尝试了两种方法,似乎对于这个卡住问题没有什么区别。

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

谢谢

最佳答案

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

关于cocoa - 调试 NSOperationQueue 阻塞,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5319673/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com