swift / CoreData - создание «фиктивных» NSManagedObjecID для моделей данных (для тестирования без необходимости в управляемых объектах) - PullRequest
0 голосов
/ 09 июня 2019

Скажите, у меня есть 2 NSManagedObject с в CoreData.

class House: NSManagedObject {}
class Location: NSManagedObject {}

У меня также есть модель данных structs, например:

struct HouseModel {
    var objectID: NSManagedObjectID
    ...
}

sruct LocationModel {
    var objectID: NSManagedObjectID
    ...
}

Для каждого загруженного managedObject Я в основном использую его атрибуты для инициализации новой структуры модели, используемой для пользовательского интерфейса и прочего (в основном, представлений коллекции)

У меня должен быть атрибут NSManagedObjectID в structs, чтобы можно было вносить изменения в managedObject, которому принадлежит структура. (Я узнал, что я должен использовать mainViewContext только для чтения, используя что-то вроде persistentContainer.performBackgroundTask для записи. Таким образом, мне нужно NSManagedObjectID для загрузки объектов в фоновую очередь)

Это работает, но есть проблема с этим подходом: Я не могу инициализировать одну из этих моделей данных без managed object. Это раздражает, когда я хочу создать фиктивные данные для тестирования пользовательского интерфейса или модульного тестирования.

Я знаю одно решение: создайте Dummy managedObject ровно с одним экземпляром и используйте его objectID для подобных вещей. Но мне это не очень нравится. Есть ли лучший / более удобный способ?

Я имею в виду, что я бы хотел полностью удалить атрибут objectID, чтобы отделить CoreData от этих моделей structs. Но я не вижу способа сделать это. Мне нужно соединение.

1 Ответ

1 голос
/ 09 июня 2019

Для передачи NSManagedObjects в подробный вид для редактирования часто бывает полезно сделать это в новом контексте управляемого объекта главной очереди, что упрощает доступ к пользовательскому интерфейсу и позволяет отбрасывать контекст, если пользователь отменяет изменения.

Но это не то, что вы спросили.

Ваша проблема в том, что вы хотите идентифицировать управляемый объект, но не использовать NSManagedObjectID.Для этого вы можете использовать свойство URL.NSManagedObjectID имеет uriRepresentation(), который возвращает URL, а NSPersistentStoreCoordinator может преобразовать URL обратно в идентификатор управляемого объекта, используя managedObjectID(forURIRepresentation:).Таким образом, вы можете сохранить любой старый URL в структуре для целей тестирования и при этом безопасно ссылаться на управляемые объекты в логике вашего приложения.

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