Swift NSManagedObjectID与自定义UUID标识符属性-获取性能
我真的希望避免使用Swift NSManagedObjectID与自定义UUID标识符属性-获取性能,swift,core-data,nsmanagedobjectcontext,nsmanagedobjectid,Swift,Core Data,Nsmanagedobjectcontext,Nsmanagedobjectid,我真的希望避免使用NSManagedObjectID将模型结构连接到它们的CoreData对象。我的意思是这样的: 假设我在CoreData中有一个Book实体,然后我有一个这样的模型结构来表示我的模型层: struct BookModel{ let name:String ... 让objectID:NSManagedObjectID//我需要它来引用数据库中的条目 } 我不喜欢这种方法。它使使用结构变得单调乏味,例如,测试很烦人,因为我总是要生成虚拟objectID或使BookModel.
NSManagedObjectID
将模型结构连接到它们的CoreData对象。我的意思是这样的:
假设我在CoreData中有一个Book
实体,然后我有一个这样的模型结构来表示我的模型层:
struct BookModel{
let name:String
...
让objectID:NSManagedObjectID//我需要它来引用数据库中的条目
}
我不喜欢这种方法。它使使用结构变得单调乏味,例如,测试很烦人,因为我总是要生成虚拟objectID或使BookModel.objectID
可选
我想要的是Book
实体中UUID
类型的id
属性。这将很容易连接到结构,并允许结构在没有数据库的情况下正确存在:
struct BookModel{
let name:String
...
let id:UUID
...
func object()->Book{
//使用带谓词的获取请求检索托管对象。
}
}
我注意到在实体中实际上可以有UUID
属性。然而,性能差异似乎是巨大的。我创建了一个示例,尝试获取单个对象10000次
首先,我使用上下文
s对象(带有:NSManagedObjectID)
获取它们。我将所有可能的objectid硬编码在一个数组中,每次都随机传递一个objectid
然后,我使用了一个带有NSPredicate
的简单获取请求,该请求传递了一个随机UUID
执行时间的差异非常显著:
带ObjectID:0.015282376s
带UUID:1.093346287s
然而,奇怪的是,第一个方法实际上没有生成任何SQL查询(我使用启动参数-com.apple.CoreData.SQLDebug 4
)记录它们)。这可以解释速度,但不能解释为什么它根本不需要与数据库通信
我做了一些研究,但无法真正弄清楚对象(使用:NSManagedObjectID)
在幕后实际做了什么
这是否意味着,使用“自定义”
UUID
属性不是一个好主意?我真的很感激任何关于这方面的见解 我不会依赖代码中的NSManagedObjectID
。它使您的代码依赖于苹果的数据库实现,而苹果的数据库实现可能会随时发生变化,并且不会使您的应用程序对未来的变化具有弹性
例如,您将无法使用新的NSPersistentCloudKitContainer
。它不支持NSManagedObjectID
:请参阅
与硬编码
NSManagedObjectID
不同,您最好按照您的建议,为您的实体提供唯一的UUID。这可能会影响性能,也可能不会影响性能,但从长远来看,您会受益匪浅,因为底层核心数据库技术将发生变化。感谢您的投入。我不知道这件事。我一直认为NSManagedObjectID
是核心数据的基本要素之一。