jar*_*ryd 5 core-data nsoperation grand-central-dispatch ios
什么更适合需要将数据存储在一个线程上的Core-Data中并从另一个线程上的Core-Data读取的情况?
我在考虑GCD但是它如何为每个线程创建NSManagedObjectContext?如何在队列中创建这些对象?
在对各种线程进行更改时,需要更新/同步数据存储,这与GCD或NSOperation有关吗?
我希望能够在根据需要读取和写入数据存储时将块传递到2个队列,而不会出现损坏存储或具有不同版本的存储的问题.
Jod*_*ins 16
GCD之间的争论NSOperation基本上归结为使用最高级抽象的论点,为您提供了一个很好的解决方案.
NSOperationQueue 它建立在GCD之上,因此它必须是更高级别的抽象.
但是,GCD在一般情况下很容易使用,我发现它NSOperationQueue在很多情况下都是优选的.
现在,当您将CoreData引入混合时,我会建议第三种方案.如果您使用的是iOS 5,那么您可以在MOC中使用私有队列并发.我发现这是一个很好的抽象,并提供了一个易于使用的界面.
所以,我建议您只NSPrivateQueueConcurrencyType为每个要进行核心数据的线程创建一个MOC .您可以根据应用程序特征选择是共享persistentStoreCoordinator还是使用单独的应用程序.你甚至可以使用嵌套的上下文(插入端有一个警告).
基本上,它遵循这个模型......
NSManagedObjectContext *moc = [[NSManagedObjectCotext alloc] initWithConcurrencyType:NSPrivateQueuqConcurrencyType];
moc.parentContext = contextIWantToBeParent;
moc.persistentStoreCoordinator = pscIWant;
[moc performBlock:^{
// Your MOC stuff running on its own private queue
}];
Run Code Online (Sandbox Code Playgroud)
当然,您必须选择一种方法(为现有MOC提供父母或附加到PSC).
我通常更喜欢这种performBlock方法.
编辑
谢谢.我读到NSManagedObject不是线程安全的.如何在该专用队列上创建新的NSManagedObject? - 氦3
是的,这是事实.但是,当您创建具有并发类型的MOC时,您同意签订类似的合同.
我,一个精明的程序员,庄严地同意以下有关并发的核心数据规则:
如果我使用NSConfinementConcurrencyType,我将只在创建它的线程上运行时使用它.
如果我使用NSPrivateQueueConcurrencyType,我将只使用MOC从内任一performBlock或performBlockAndWait.
如果我使用NSMainQueueConcurrencyType,我将只使用MOC从内部或者performBlock,performBlockAndWait或者当我知道我在主线程上运行.
如果您遵循这些规则,那么您将能够在其他线程上使用MOC.
具体来说,在使用时performBlock,Core Data API将确保代码适当地同步.