我试图找到这个问题的答案,但我无法从文档和 StackOverflow 中找出问题。如果已经有这样的问题,我只是没有找到它,所以它会非常欢迎作为以防万一的解决方案。
我的情况是:我有两个核心数据实体,一个用户和一个驾驶执照。
User <--- 1 to 1 ---> Driving Licence
我使用Magical Record作为核心数据操作的抽象层。
我的用户类(从 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];
}
有时,我会很随意地说,drivingLicence 字段恰好为空。后台线程可能会调用resetFields方法。
难道是为了与其他上下文的合并,指令序列
[self.drivingLicence MR_deleteEntity];
self.drivingLicence = [DrivingLicence MR_createEntity];
会引起一些混乱,最终将驾驶执照删除吗?或者还有什么可能是这个意外的空值的原因?