我试图找到这个问题的答案,但我无法从文档和 StackOverflow 中找出问题。如果已经有这样的问题,我只是没有找到它,所以作为万一的解决方案将非常受欢迎。
我的情况是: 我有两个核心数据实体,一个用户和一个驾驶执照。
User <--- 1 to 1 ---> Driving Licence
我正在使用Magical Record作为核心数据操作的抽象层。
我的 User 类(派生自 NSManagedObject)公开了 2 个方法。
用于访问用户的单例实例(整个应用程序中唯一使用的实例):
+ (User *)currentUser {
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
if ([User MR_findFirst] == nil) {
User *user = [User MR_createEntity];
user.drivingLicence = [DrivingLicence MR_createEntity];
[[user managedObjectContext] MR_save];
}
});
return [User MR_findFirst];
}
以及用于重置用户数据的方法(派生自 NSManagedObject):
- (void)resetFields
{
self.name = nil;
self.surname = nil;
....
[self.drivingLicence MR_deleteEntity];
self.drivingLicence = [DrivingLicence MR_createEntity];
[self.managedObjectContext MR_save];
}
有时,我会随机地说,driveLicence 字段恰好为空。 有时后台线程可能会调用 resetFields 方法。
是否是为了与其他上下文合并,指令序列
[self.drivingLicence MR_deleteEntity];
self.drivingLicence = [DrivingLicence MR_createEntity];
会导致一些困惑,导致驾驶执照最后被删除吗? 或者还有什么原因导致这个意外的空值?
最佳答案
当您使用 MR_createEntity 时,您会隐式使用通过[NSManagedObjectContext MR_defaultContext]访问的默认上下文。这样做是非常危险的,除非你绝对肯定你是从主线程调用它的。在您的示例中,如果从主线程调用所有内容并且您的 self.managementObjectContext 实例变量也指向默认上下文,那么所有这些都应该正常工作。否则,您将需要明确您正在使用哪些上下文。 MagicalRecord 通过在每个需要上下文才能工作的方法末尾添加一个 inContext: 可选参数来为您提供这些约定。查看 MR_createInContext: 方法并明确您的上下文用法
关于iphone - 核心数据合并行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13360366/