如何创建一个孩子的NSManagedObjectContext?(How do I create a

2019-07-31 08:39发布

我见过几个视频/线程说,这是可能创造“孩子” MOCS - 使用其他MOCS他们的持续性商店MOCS。 有用的,例如,在你线程应用程序,并希望有一个单一的主MOC,可以节省/回滚子线程创建变化的背景下。 (据我所知,一个MOC和它的managedObjects都必须在同一线程上使用)

现在的问题是,如何创建一个孩子MOC? 我不能追查WWDC视频我在看介绍了他们,我“已经看到一切都在谈论如何使用他们,一旦他们的制作,我可以很容易的Alloc新的MOC,但我怎么设置它的持久性存储是另一个MOC?参考并不表明做任何功能!

Answer 1:

创建一个新的MOC而您是在同步的总量控制。 这是与调用init和相同的行为预父/子关系。

NSManagedObjectContext *moc = [[NSManagedObjectContext alloc]
       initWithConcurrencyType:NSConfinementConcurrencyType];

你父MOC通过设置其属性另一商务部:

moc.parentContext = someOtherMocThatIsNowMyParent;

在这里,孩子选择父。 我敢肯定,我的孩子们希望自己是NSManagedObjectContexts。 父上下文必须是的NSPrivateQueueConcurrencyTypeNSMainQueueConcurrencyType

您可以创建一个MOC是“绑定”到一个专用队列:

NSManagedObjectContext *moc = [[NSManagedObjectContext alloc]
       initWithConcurrencyType:NSPrivateQueueConcurrencyType];

这意味着你应该只通过访问performBlockperformBlockAndWait 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.
}];

之间的区别performBlockperformBlockAndWaitperformBlock将创建的代码块,并与大中央调度安排它要在未来的一段时间内异步执行,在一些不知名的线程。 这个方法调用将立即返回。

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.
}];

这意味着你只应该直接访问它,如果你知道你是在主线程, 通过performBlockperformBlockAndWait API。

现在,你可以通过使用“主并发” MOC要么performBlock方法,或直接,如果你知道你已经在主线程中运行。



Answer 2:

初始化子MOC则:

[_childMOC performBlockAndWait:^{
            [_childMOC setParentContext:parentMOC]; 
 }];


文章来源: How do I create a child NSManagedObjectContext?