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 个 NSManagedObject
s。
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 测试或单元测试创建虚拟数据时,这很烦人。
我知道一种解决方案:创建一个只有一个实例的Dummy
managedObject
,然后使用它的 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