NSManagedObjectID против пользовательского атрибута идентификатора UUID - получить производительность - PullRequest
0 голосов
/ 02 апреля 2020

Я действительно хотел бы избежать использования 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 не очень хорошая идея? Я был бы очень признателен за любые идеи по этому поводу!

1 Ответ

1 голос
/ 04 апреля 2020

Я бы не стал полагаться на NSManagedObjectID в вашем коде. Это делает ваш код зависимым от реализации базы данных Apple, которая может измениться в любое время, и не сделает ваше приложение устойчивым к будущим изменениям.

Например, вы не сможете использовать новый NSPersistentCloudKitContainer. Он не поддерживает NSManagedObjectID: см. https://developer.apple.com/documentation/coredata/mirroring_a_core_data_store_with_cloudkit/creating_a_core_data_model_for_cloudkit

Вместо жесткого кодирования NSManagedObjectID вам лучше дать вашим сущностям уникальные UUID, как вы предлагали. Это может повлиять или не повлиять на производительность, но в долгосрочной перспективе вам будет лучше, так как базовые технологии баз данных изменятся.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...