在一个核心数据应用程序中,我正在将一些代码从我的控制器转移到我的模型中。
我已经编写了一个方法,它为我定期发出的特定提取请求返回一个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编写干净的访问器方法?
发布于 2013-10-04 17:52:00
您可以在任何需要在后台进行查找的地方创建临时MOC。这当然是线程-dafe,它比使用in更快(实际上,它是快速的,因为创建MOC本身是快速的)。
这样做的一种方法是通过指定NSPrivateQueueConcurrencyType并发类型的子上下文到主上下文:
+ (TeamProject*)teamProjectWithProjectId:(NSNumber *)projectId inContext:(NSManagedObjectContext*)context
{
NSManagedObjectContext *temporaryContext = [[NSManagedObjectContext alloc] initWithConcurrencyType:NSPrivateQueueConcurrencyType];
temporaryContext.parentContext = context;
NSFetchRequest *teamRequest = [[NSFetchRequest alloc] initWithEntityName:@"TeamProject"];
NSPredicate *teamPredicate = [NSPredicate predicateWithFormat:@"teamProjectId == %@",projectId];
teamRequest.predicate = teamPredicate;
TeamProject *teamProject = [[temporaryContext executeFetchRequest:teamRequest error:nil] lastObject];
return teamProject;
}还可以查看这个职位的更多场景和解决方案。
编辑:
为了使事情更清楚,上面的方法是从使用返回MO的同一个线程调用的。它只是上面方法的一个“扩展”,因为它使用本地创建的MOC包装了fetch操作,这个MOC对这个线程是私有的,所以您可以安全地使用它。
换句话说,您可以从任何线程调用上面的方法,并在同一个线程中安全地使用返回的MO。使用子MOC的技巧允许您通过创建临时私有MOC在任何线程中进行获取。
引用在另一个线程中创建的MOC在当前线程中创建子MOC是安全的。
仍然不允许将托管对象从一个线程传递到另一个线程。
https://stackoverflow.com/questions/19187584
复制相似问题