swift / Core Data - 为数据模型创建“虚拟”NSManagedObject(无需托管对象即可测试事物)

Posted

技术标签:

【中文标题】swift / Core Data - 为数据模型创建“虚拟”NSManagedObject(无需托管对象即可测试事物)【英文标题】:swift / CoreData - Create "dummy" NSManagedObjecIDs for data models (to test things without the need of managed objects) 【发布时间】:2019-06-09 16:08:18 【问题描述】:

假设我在 CoreData 中有 2 个 NSManagedObjects。

class House: NSManagedObject 
class Location: NSManagedObject 

我也有这样的数据模型structs

struct HouseModel 
    var objectID: NSManagedObjectID
    ...


sruct LocationModel 
    var objectID: NSManagedObjectID
    ...

对于每个加载的managedObject,我基本上使用它的属性来初始化一个新的模型结构以用于 UI 和其他东西(主要是集合视图)

我必须在structs 中有NSManagedObjectID 属性才能更改结构所属的managedObject。 (我了解到我应该只使用mainViewContext 来阅读,而使用persistentContainer.performBackgroundTask 之类的东西来写作。因此,我需要NSManagedObjectID 将对象加载到后台队列中)

这是可行的,但这种方法存在问题: 如果没有managed object,我将无法初始化其中一个数据模型。当我想为 UI 测试或单元测试创​​建虚拟数据时,这很烦人。

我知道一种解决方案:创建一个只有一个实例的DummymanagedObject,然后使用它的 objectID 来处理类似的事情。但我真的不喜欢这个。有没有更好/更方便的方法?

我的意思是,我很想完全删除 objectID 属性以使 CoreData 与这些模型 structs 分开。但我看不出有办法做到这一点。我需要连接。

【问题讨论】:

【参考方案1】:

为了将NSManagedObjects 传递给详细视图进行编辑,在新的主队列托管对象上下文中执行此操作通常很有用,这简化了您的 UI 访问,并允许您在用户取消更改时丢弃上下文。

但这不是你问的。

您的问题是您想识别托管对象,但不使用NSManagedObjectID。为此,您可以改用 URL 属性。 NSManagedObjectID 有一个返回 URL 的 uriRepresentation()NSPersistentStoreCoordinator 可以使用 managedObjectID(forURIRepresentation:) 将 URL 转换回托管对象 ID。因此,您可以将任何旧 URL 存储在结构中以用于测试目的,并且仍然可以安全地引用应用程序逻辑中的托管对象。

【讨论】:

以上是关于swift / Core Data - 为数据模型创建“虚拟”NSManagedObject(无需托管对象即可测试事物)的主要内容,如果未能解决你的问题,请参考以下文章

Swift Core Data:Core Data 中的枚举 [重复]

模型和数据存储引擎的 Swift Core Data [关闭]

Swift Core Data NSFetchRequest 没有结果

如何在 Swift 中将可转换属性保存到 Core Data

CoreData学习:Core Data Stack(Swift)

Swift之深入解析Core Data数据管理的集成指南