【问题标题】:swift / CoreData - Create "dummy" NSManagedObjecIDs for data models (to test things without the need of managed objects)swift / Core Data - 为数据模型创建“虚拟”NSManagedObject(无需托管对象即可测试事物)
【发布时间】: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 分开。但我看不出有办法做到这一点。我需要连接。

【问题讨论】:

    标签: ios swift core-data


    【解决方案1】:

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

    但这不是你问的。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-08
      • 2015-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多