上下文的 userInfo 的用途是什么?
我看了这几种方法,不幸的是没有找到任何确定的东西。
- 在
-[NSManagedObjectContext userInfo] 上设置一个符号断点并运行一组核心数据回归测试,这些测试运行大部分公共 API。
- 使用多个逆向工程工具查看了 Core Data 二进制框架。
使用符号断点并没有产生太大的影响,尽管我使用的 Xcode 版本有可能刚刚超过它。似乎没有任何东西在访问公共访问器,但考虑到 Core Data 的内部结构,这并不令人惊讶。
反汇编该方法产生了一些提示:
void * -[NSManagedObjectContext userInfo](void * self, void * sel) {
rsi = sel;
rbx = self;
if (*(int32_t *)__PF_Threading_Debugging_level != 0x0) {
__PFAssertSafeMultiThreadedAccess_impl(rbx, rsi);
}
rax = *_OBJC_IVAR_$_NSManagedObjectContext._additionalPrivateIvars;
rax = *(rbx + rax);
rax = *(rax + 0x30);
return rax;
}
该方法确实检查并发调试是否处于活动状态,以及该方法是否在并发规则中正确使用(这回答了问题 3)。该方法是直接访问私有实例变量_additionalPrivateIvars,Core Data 的其他部分从中读取和写入。一些更改跟踪/推进和乐观锁定方法使用此实例变量。例如,-lockObjectStore 在NSManagedObjectContext 上写信给_additionalPrivateIvars。
有点奇怪,NSMutableDictionary 是只读的。您无法设置新的NSMutableDictionary,但您可以愉快地在其上设置键和值。我能够很容易地做到这一点:
(lldb) po [[[result managedObjectContext] userInfo] setValue:@"foo" forKey:@"bar"]
0x0000000000000020
(lldb) po [[result managedObjectContext] userInfo]
{
bar = foo;
}
如果没有来自 Apple 的更详细的指导,我不想在生产代码中这样做,因为这样写可能很危险。
它是否曾经保存到持久存储或通过 NSCoding?
似乎没有,这样做没有多大意义。持久存储对通过协调器访问它们的上下文知之甚少,如果 userInfo 字典对存储很重要,则应在原子存储编程指南和增量存储编程指南中进行介绍。
它是否使用与上下文的托管对象相同的线程模型?
确实如此,如果并发调试是主动滥用-userInfo 将记录一个断言。