我正在将一些代码从我的控制器移动到核心数据应用程序中的模型。
我编写了一个方法,该方法为我定期发出的特定获取请求返回一个 NSManagedObjectID。
+ (NSManagedObjectID*)teamProjectWithProjectId:(NSNumber *)projectId inContext:(NSManagedObjectContext*)context
{
NSFetchRequest *teamRequest = [[NSFetchRequest alloc] initWithEntityName:@"TeamProject"];
NSPredicate *teamPredicate = [NSPredicate predicateWithFormat:@"teamProjectId == %@",projectId];
teamRequest.predicate = teamPredicate;
TeamProject *teamProject = [[context executeFetchRequest:teamRequest error:nil] lastObject];
if (teamProject)
{
return [teamProject objectID];
}
else
{
return nil;
}
return nil;
}
现在在任何地方我都需要使用我这样做的方法:
NSManagedObjectID *teamProjectMoId = [TeamProject teamProjectWithProjectId:projectID];
TeamProject *currentProject = nil;
if (teamProjectMoId)
{
currentProject = (TeamProject*)[self.managedObjectContext objectWithID:teamProjectMoId];
}
现在这还不错,它可以工作并且它尊重 NSManagedObject 不是线程安全的,而 NSManagedObjectID 是线程安全的。我很高兴能够将相当多的代码从我的控制器类移到我的模型类别中。
然而,这还不够好。我真的很想以尊重线程安全的方式只用一行代码访问一个 NSManagedObject。我的理想是能够写出这样的东西:
TeamProject *currentProject = [TeamProject magicalMethodThatHandlesThreadSafety];
这甚至可能吗?或者有没有人有任何策略来为 NSManagedObject 编写干净的访问器方法?