Osc*_*mez 7 iphone core-data thread-safety nsmanagedobjectcontext ios
直接从NSManagedObjectContext 文档中我对以下段落感到困惑:
基于队列的托管对象上下文的Setter方法是线程安全的.您可以直接在任何线程上调用这些方法.
最大的问题是ManagedObjectContext上的setters方法,但不是在这个上下文拥有的ManagedObjects中?还是两者兼而有之?特别是如果对于私有队列MOC对象是这样的:
[privateContext setPersistentStoreCoordinator:self.persistentStoreCoordinator];
Run Code Online (Sandbox Code Playgroud)
无论线程执行此行,都是线程安全的,但是会像:
[myPrivateQueueOwnedManagedObject setTitle:@"My Title];
Run Code Online (Sandbox Code Playgroud)
也是线程安全吗?文档对此真的很模糊,但我的理解是,这不是线程安全是正确的吗?
在ManagedObjectContext中获取属性的getter如请求persistentStoreCoordinator属性会是线程安全的吗?我的理解是它不会.
另外,我一直认为某些托管对象属性(如objectID)是线程安全的,不需要使用performBlock:或performBlockAndWait进行访问:托管对象上是否存在线程安全的其他任何属性?
-setPersistentStoreCoordinator:是线程安全的,因为它是托管对象上下文的setter方法.
-setTitle:不是因为您在托管对象上调用setter .
您可以使用debug标志确认此行为:
-com.apple.CoreData.ConcurrencyDebug 1
Run Code Online (Sandbox Code Playgroud)
当你违反线程限制时,这将抛出一个断言.
虽然我们只是为了确认文档的第二段,但是在主线程上访问主样式队列MOC对象时是否可以安全地访问BOTH MOC和MO?我的理解是,例如,如果上下文是Main样式并且线程是主线程,setTitle就可以了.这是由于遗留原因,线程限制为afaik,并且在使用MO进行UI更新时也提供了很大的帮助.
如果定义为主队列的上下文并且您在主队列(也就是UI线程,也就是主线程)上,则是,您可以直接访问所有内容而无需使用-performBlock:.您在上下文所属的线程上,因此您遵循线程限制规则.
| 归档时间: |
|
| 查看次数: |
522 次 |
| 最近记录: |