我见过几个视频/线程说,这是可能创造“孩子” MOCS - 使用其他MOCS他们的持续性商店MOCS。 有用的,例如,在你线程应用程序,并希望有一个单一的主MOC,可以节省/回滚子线程创建变化的背景下。 (据我所知,一个MOC和它的managedObjects都必须在同一线程上使用)
现在的问题是,如何创建一个孩子MOC? 我不能追查WWDC视频我在看介绍了他们,我“已经看到一切都在谈论如何使用他们,一旦他们的制作,我可以很容易的Alloc新的MOC,但我怎么设置它的持久性存储是另一个MOC?参考并不表明做任何功能!
创建一个新的MOC而您是在同步的总量控制。 这是与调用init
和相同的行为预父/子关系。
NSManagedObjectContext *moc = [[NSManagedObjectContext alloc]
initWithConcurrencyType:NSConfinementConcurrencyType];
你父MOC通过设置其属性另一商务部:
moc.parentContext = someOtherMocThatIsNowMyParent;
在这里,孩子选择父。 我敢肯定,我的孩子们希望自己是NSManagedObjectContexts。 父上下文必须是的NSPrivateQueueConcurrencyType
或NSMainQueueConcurrencyType
。
您可以创建一个MOC是“绑定”到一个专用队列:
NSManagedObjectContext *moc = [[NSManagedObjectContext alloc]
initWithConcurrencyType:NSPrivateQueueConcurrencyType];
这意味着你应该只通过访问performBlock
或performBlockAndWait
API。 你可以从任何线程这些方法,因为它们将确保块中的代码的正确序列化。 例如...
NSManagedObjectContext *moc = [[NSManagedObjectContext alloc]
initWithConcurrencyType:NSPrivateQueueConcurrencyType];
moc.parentContext = someOtherMocThatIsNowMyParent;
[moc performBlock:^{
// All code running in this block will be automatically serialized
// with respect to all other performBlock or performBlockAndWait
// calls for this same MOC.
// Access "moc" to your heart's content inside these blocks of code.
}];
之间的区别performBlock
和performBlockAndWait
是performBlock
将创建的代码块,并与大中央调度安排它要在未来的一段时间内异步执行,在一些不知名的线程。 这个方法调用将立即返回。
performBlockAndWait
会做一些神奇的同步与所有其他performBlock
呼叫,而当已经这个之前提出的所有块完成后,该块将被执行。 调用线程将挂起,直到该调用完成。
您还可以创建一个MOC是“绑定”到主线程,就像私人并发。
NSManagedObjectContext *moc = [[NSManagedObjectContext alloc]
initWithConcurrencyType:NSMainQueueConcurrencyType];
moc.parentContext = someOtherMocThatIsNowMyParent;
[moc performBlock:^{
// All code running in this block will be automatically serialized
// with respect to all other performBlock or performBlockAndWait
// calls for this same MOC. Furthermore, it will be serialized with
// respect to the main thread as well, so this code will run in the
// main thread -- which is important if you want to do UI work or other
// stuff that requires the main thread.
}];
这意味着你只应该直接访问它,如果你知道你是在主线程, 或通过performBlock
或performBlockAndWait
API。
现在,你可以通过使用“主并发” MOC要么performBlock
方法,或直接,如果你知道你已经在主线程中运行。
初始化子MOC则:
[_childMOC performBlockAndWait:^{
[_childMOC setParentContext:parentMOC];
}];