Я действительно хотел бы избежать использования NSManagedObjectID
в качестве способа соединения структур моей модели с их объектами CoreData. Я имею в виду что-то вроде этого:
Скажем, у меня есть сущность Book
в CoreData, а затем у меня есть структура модели, подобная этой, для моего слоя модели:
struct BookModel {
let name: String
...
let objectID: NSManagedObjectID // I need this to refer back to the entry in the database
}
Я не Мне не нравится этот подход. Это делает работу со структурами утомительной, и, например, тестирование раздражает, потому что мне всегда приходится генерировать фиктивные objectIds или делать BookModel.objectID
необязательным.
Мне бы хотелось иметь свойство id
типа UUID
внутри сущности Book
. Это было бы так легко подключить к структурам, а также позволило бы должным образом существовать структурам без базы данных:
struct BookModel {
let name: String
...
let id: UUID
...
func object() -> Book {
// Retrieve managed object using a fetch request with a predicate.
}
}
Я заметил, что на самом деле вы можете иметь UUID
свойства в сущности. Однако разница в производительности кажется огромной. Я создал пример, который пытается выбрать отдельные объекты 10000 раз.
Сначала я выбрал их, используя context
s object(with: NSManagedObjectID)
. Я жестко запрограммировал все возможные objectIds в массиве и каждый раз передавал случайный.
Затем я использовал простой запрос на выборку с NSPredicate
, который получил случайный UUID.
Разница во времени выполнения значительна:
С ObjectID: 0.015282376s
С UUID: 1.093346287s
Однако странным является то, что первый метод на самом деле не выдавал SQL запросов (я зарегистрировал их, используя аргумент запуска -com.apple.CoreData.SQLDebug 4
). Это объясняет скорость, но не то, почему ей вообще не нужно общаться с базой данных.
Я немного исследовал, но не могу понять, что на самом деле делает object(with: NSManagedObjectID)
за кулисами.
Означает ли это, что использование пользовательского свойства UUID
не очень хорошая идея? Я был бы очень признателен за любые идеи по этому поводу!