我想使用 anNSOperationQueue
来调度 CoreData 操作。但是,操作队列的行为并不总是相同的(例如,它libdispatch
在使用线程池的 iOS 4.0/OS 10.6 上调度)并且队列可能并不总是使用相同的线程(根据NSManagedObjectContext
需要)。
我可以强制串行NSOperationQueue
在单个线程上执行吗?还是我必须为此创建自己的简单排队机制?
我想使用 anNSOperationQueue
来调度 CoreData 操作。但是,操作队列的行为并不总是相同的(例如,它libdispatch
在使用线程池的 iOS 4.0/OS 10.6 上调度)并且队列可能并不总是使用相同的线程(根据NSManagedObjectContext
需要)。
我可以强制串行NSOperationQueue
在单个线程上执行吗?还是我必须为此创建自己的简单排队机制?
我可以强制串行 NSOperationQueue 在单个线程上执行吗?还是我必须为此创建自己的简单排队机制?
你不应该做其中任何一个。Core Data 真正需要的是,您没有两段代码同时更改托管对象上下文。在Concurrency with Core Data的开头甚至有一个注释:
注意:您可以使用线程、串行操作队列或调度队列进行并发。为了简洁起见,本文始终使用“线程”来指代其中的任何一个。
真正需要的是在给定的上下文中序列化操作。如果您使用单个线程,这自然会发生,但是如果您设置maxConcurrentOperationCount
为 1,NSOperationQueue 也会对其操作进行序列化,因此您不必担心确保所有操作都发生在同一个线程上。
Apple 决定将托管对象绑定到真正的线程。在不同线程上访问上下文不再那么安全了——没有任何对象的上下文可能是安全的,但它的对象不是