首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >通过NSManagedObject

通过NSManagedObject
EN

Stack Overflow用户
提问于 2013-10-04 17:46:46
回答 1查看 442关注 0票数 0

在一个核心数据应用程序中,我正在将一些代码从我的控制器转移到我的模型中。

我已经编写了一个方法,它为我定期发出的特定提取请求返回一个NSManagedObjectID。

代码语言:javascript
复制
+ (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;
}

现在,我需要在任何地方使用我这样做的方法:

代码语言:javascript
复制
NSManagedObjectID *teamProjectMoId = [TeamProject teamProjectWithProjectId:projectID];
TeamProject *currentProject = nil;
if (teamProjectMoId)
{
    currentProject = (TeamProject*)[self.managedObjectContext objectWithID:teamProjectMoId];
}

现在这还不算太糟,它可以工作,它尊重NSManagedObject不是线程安全的,而NSManagedObjectID是线程安全的。我很高兴能够将相当多的代码从我的控制器类移到我的模型类别中。

,但是,这还不够好,--我真的很想以一种尊重线程安全的方式,用一行代码来访问NSManagedObject。我的理想是能写出这样的东西:

代码语言:javascript
复制
TeamProject *currentProject = [TeamProject magicalMethodThatHandlesThreadSafety];

这有可能吗?或者有人有任何策略来为NSManagedObject编写干净的访问器方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-04 17:52:00

您可以在任何需要在后台进行查找的地方创建临时MOC。这当然是线程-dafe,它比使用in更快(实际上,它是快速的,因为创建MOC本身是快速的)。

这样做的一种方法是通过指定NSPrivateQueueConcurrencyType并发类型的子上下文到主上下文:

代码语言:javascript
复制
+ (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是安全的。

仍然不允许将托管对象从一个线程传递到另一个线程。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19187584

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档