Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift NSManagedObjectID与自定义UUID标识符属性-获取性能_Swift_Core Data_Nsmanagedobjectcontext_Nsmanagedobjectid - Fatal编程技术网

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
是核心数据的基本要素之一。