澄清

2014-01-13 233 views
2

一边念叨NSConfinementConcurrencyType的医生,我阅读下列澄清

不能使用结合这种并发类型与新 嵌套环境功能

这个句子对我来说很奇怪,因为我可以做,例如,在NSOperation的子类中,如

NSManagedObjectContext * localMOC = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSConfinementConcurrencyType]; 
[localMOC setParentContext:[self mainContext]]; 

其中mainContext可以从外部注入并且类型为NSMainQueueConcurrencyType

我错过了什么吗?

回答

2

是的,该文档是很差措辞。

我觉得它的意思是,你不能使用:

NSManagedObjectContext *moc = [[NSManagedObjectContext alloc] init]; 
[moc setParentContext:[self managedObjectContext]]; 

这一点我以前测试,它没有失败,出现错误。 YMMV,当然,我在iOS 5.x中测试它。

这比不同:

NSManagedObjectContext * localMOC = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSConfinementConcurrencyType]; 
[localMOC setParentContext:[self mainContext]]; 

这工作得很好,是核心数据设计的一部分。

两个初始化程序之间存在细微差别,而较早的历史初始化程序缺少一些允许父子上下文正常工作的关键组件。

+1

嗯,我很确定我不得不几次改变为私有队列类型,因为我想添加一个子上下文。很确定我得到了奇怪的行为或使用受限类型作为父项的错误。出于某种原因,这些类型的错误并不是每次都会发生,但是当您进行一些更改并检测到问题时,会在奇数时间出现。 –

+1

更重要的是,限制队列期望上下文被创建它的线程访问和改变。如果孩子MOC从另一个线程推送更改,则只是要求未定义的行为。 – CodaFi

+0

不错。谢谢你做一些测试。 –

1

我可能是错的,但根据一个简短的测试是在我看来,在NSConfinementConcurrencyType

限制 不能结合新 嵌套环境功能

使用这种并发类型

适用于父上下文而不适用于子上下文。所以

NSManagedObjectContext * localMOC = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSConfinementConcurrencyType]; 
[localMOC setParentContext:[self mainContext]]; 

作品,只要[self mainContext]已与主或私人 队列并发类型创建。

+0

如果这就是他们的意思,那么它就比我想象的更糟糕了:)话虽如此,我已经把孩子们关在一个密闭的MOC之前,没有任何不良影响,所以我不认为阅读是准确的。 –

+0

@ MarcusS.Zarra:将孩子附加到受限制的MOC(或默认MOC)时使用父类NSManagedObjectContext必须在我的测试中使用NSPrivateQueueConcurrencyType或NSMainQueueConcurrencyType.'',而与子MOC的类型无关。 –

+0

有趣。时间去找到这个例子或者检查内存问题。感谢您的双重检查:) –