使用 CoreData,我如何确定 NSManagedObject 是不是在特定上下文中?

Posted

技术标签:

【中文标题】使用 CoreData,我如何确定 NSManagedObject 是不是在特定上下文中?【英文标题】:With CoreData, how can I determine if an NSManagedObject is in a specific context?使用 CoreData,我如何确定 NSManagedObject 是否在特定上下文中? 【发布时间】:2014-10-26 06:35:02 【问题描述】:

在核心数据中,您只能通过从中获取对象的上下文来操作对象。这意味着,如果你有两个上下文,我们称它们为 mainContext 和 backGround 上下文,backGround 上下文必须只更新来自 backgroundContext 的对象,而 mainContext 必须只更新来自 mainContext 的对象。这听起来很简单。

这是我的问题。我有一个来自未知上下文的对象,如何确定该对象是来自 mainContext 还是 backgroundContext?我知道 managedObject 有一个指向它的 managedObjectContext 的指针,称为“managedObjectContext”,但我不知道如何将它与指向 mainContext 和 backgroundContext 的指针进行比较以查看它在哪一个?请帮忙。

【问题讨论】:

[myObject.managedObjectContext isEqual:mainObjectContext]?我应该补充一点,如果你想要指针比较而不是对象相等,我相信你想要 == 【参考方案1】:

你有的地方:

id yourMainContext = ...
id yourBGContext = ...

现在检查上下文:

id yourObjectsContext = yourObject.managedObjectContext;
BOOL equalToMain = [yourObjectsContext isEqual:yourMainContext];
BOOL equalToBG = [yourObjectsContext isEqual:yourBGContext];

完整解决方案

要存储 mainQueue/BGQueue 的上下文,您还可以使用函数 dispatch_queue_set_specific

你有的地方:

id yourMainContext = ...
dispatch_queue_set_specific(dispatch_get_main_queue(), "MOC", yourMainContext);

还有其他地方

id yourBGContext = ...
dispatch_queue_set_specific(theBGQueue, "MOC", yourBGContext);

现在稍后检查上下文:

id queueContext = dispatch_get_specific("MOC");
assert(queueContext);

id yourObjectsContext = yourObject.managedObjectContext;
BOOL equalToQueue = [yourObjectsContext isEqual:queueContext];
//SAFE TO MODIFY    

【讨论】:

【参考方案2】:

现在在 ios8 NSManagedObjectContext 中有一个属性名称,您可以使用它并进行比较:

[yourObjectsContext.name isEqualToString:yourBGContext.name]

【讨论】:

以上是关于使用 CoreData,我如何确定 NSManagedObject 是不是在特定上下文中?的主要内容,如果未能解决你的问题,请参考以下文章

如何让 SwiftUI 与 Core Data 一起工作(在启动项目后)?

CoreData - 如何使用 validateForDelete:确定是不是应删除托管对象

使用 IBAction 插入数据抛出异常

CoreData获取属性类型 - 如何确定它是不是是原始的

UIApplication 的委托属性

JSON编码和解码核心数据