2012-07-14 30 views
7

我想用一个NSOperationQueue派遣CoreData操作。但是,操作队列行为并不总是相同的(例如,在使用线程池的iOS 4.0/OS 10.6上使用libdispatch进行调度),并且队列可能不总是使用相同的线程(如NSManagedObjectContext要求)。NSOperationQueue指定线程

我可以强制串行NSOperationQueue在单个线程中执行? 或者我必须为此创建自己的简单排队机制?

+0

您可能不需要知道您的操作正在哪个线程上执行。您可以锁定上下文(使用' - [上下文锁定]')并在完成后解锁。注意不要从锁定的块中访问任何Core Data属性。不要忘记将最大并发操作设置为1以避免需要上下文同步。 – cdelacroix 2012-07-14 23:24:57

回答

3

我可以强制串行NSOperationQueue在单个线程中执行? 或者我必须为此创建自己的简单排队机制?

你不应该需要做这类原因。 Core Data真正需要的是,您没有两条代码同时对受管对象上下文进行更改。目前在Concurrency with Core Data一开始甚至一张纸条上这样的:

注:您可以使用线程,串口操作队列或调度队列并发。 为了简洁起见,本文全文使用“线程”来指代其中的任何一个。

真正需要的是您在给定的上下文中序列化操作。如果您使用单个线程,则会自然发生,但如果将maxConcurrentOperationCount设置为1,则NSOperationQueue也会序列化其操作,因此您不必担心所有操作都发生在同一个线程上。

+4

警告:这个答案是'错误的'! Coredata需要每个THREAD一个上下文(真正的!) – 2012-11-02 08:48:11

+0

我以为你需要每个线程的MOC,不是吗? – ruipacheco 2012-11-02 10:14:26

+0

@Dominick,请为你的断言提供权威参考。我的答案中的信息直接来自Apples文档,并且WWDC多次重复了同样的想法。 – Caleb 2012-11-02 12:19:11

-1

苹果公司决定结合的管理对象,以真实线程..它不是说安全了访问在不同的线程上下文 - 上下文,没有任何物体可能是安全的,但其对象不是

+0

请再次提供参考。您的建议与Core Data文档相矛盾,在iOS 6 SDK发行说明中我没有看到任何支持您答案的内容。那么你在哪里获得你的信息? – Caleb 2012-11-02 13:45:57

+0

请参阅上述答案中的文档;)并查看google ..例如:http://stackoverflow.com/questions/67154/is-it-safe-to-manipulate-objects-that-i-created-outside-my-线程,如果我不dont-exp – 2012-11-07 13:30:47

+0

感叹..为什么投票 - 请至少花几秒钟来解释它 – 2015-06-30 17:45:46