NSOperationQueue指定线程

8
我希望使用NSOperationQueue来分发CoreData操作。然而,操作队列的行为并不总是相同的(例如,在iOS 4.0 / OS 10.6上使用libdispatch来调度使用线程池),并且队列可能不会始终使用相同的线程(因为NSManagedObjectContext需要)。
我能否强制一个串行的NSOperationQueue在单个线程上执行? 还是说我必须创建自己的简单队列机制?

你可能不需要知道你的操作在哪个线程上执行。你只需锁定上下文(使用“- [context lock]”),并在完成后解锁即可。注意不要在锁定块之外访问任何Core Data属性。不要忘记将最大并发操作设置为1,以避免需要上下文同步。 - cdelacroix
2个回答

4
我可以强制一个串行NSOperationQueue在单个线程上执行吗? 还是说我必须为此创建自己的简单队列机制?
你不需要做这两个事情。Core Data真正要求的是,您不应该有两个代码片段同时对托管对象上下文进行更改。在并发处理Core Data文章的开头甚至有一条注释:
注意:您可以使用线程、串行操作队列或分派队列进行并发处理。为了简洁起见,本文始终使用“线程”一词来引用它们中的任何一个。
实际上所需要的是在给定的上下文中序列化操作。如果您使用单个线程,这会自然地发生,但如果将maxConcurrentOperationCount设置为1,则NSOperationQueue也会将其操作串行化,因此您不必担心确保所有操作都在同一线程上执行。

4
警告:这个答案是“错误的”!CoreData需要每个线程(真实的线程!)一个上下文。 - Daij-Djan
@Dominick,请提供你的断言的权威参考资料。我的答案中的信息直接来自苹果文档,并且这个想法在WWDC上已经多次重复了。 - Caleb
如果MOC必须绑定到特定的线程,那么在块中使用Core Data将会很困难,因为您无法控制哪个GCD工作线程运行给定的块。 - Caleb
写对我的名字 @caleb :P另外,你帖子中链接的文档相互矛盾,与谷歌搜索结果不符。例如:https://dev59.com/o0XRa4cB1Zd3GeqPpCP- - Daij-Djan
@Adam 那么你可能误解了我的回答或者链接的回答。请仔细阅读链接的回答(整个回答),以及我引用的文档中的注释和此处的先前评论。NSOperationQueue是一种有效的序列化访问 MOC 的机制,在这些上下文中使用“线程”只是“线程/调度队列/操作队列”的简称。 - Caleb
显示剩余3条评论

0

苹果决定将托管对象绑定到真实线程上。在不同的线程上访问上下文不再安全 - 没有任何对象的上下文可能是安全的,但它的对象不是。


请再提供一个参考文献。您在这里的建议与Core Data文档相矛盾,我在iOS 6 SDK发布说明中也没有看到任何支持您答案的内容。那么您是从哪里获取信息的? - Caleb
请参见文档(见上方您的答案)和 Google。例如:https://dev59.com/o0XRa4cB1Zd3GeqPpCP- - Daij-Djan
叹气..为什么要踩我 - 请至少花几秒钟解释一下。 - Daij-Djan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接