Я пишу приложение, используя шаблон MVVM
. И я не знаю, как лучше всего получить доступ к Core Data
стеку из разных мест в моем приложении.
Первый подход заключается в использовании внедрения зависимостей: в AppDelegate
создайте постоянный контейнер, передайте его CoreDataService
а затем внедрить этот сервис в мои ViewModels (одновременно передать managedObjectContext
как переменную окружения в мои Views). Таким образом, однако, доступ к контексту во всем приложении более сложен: например, при декодировании сетевых ответов, поскольку у них нет доступа к managedObjectContext
:
protocol APIResource {
associatedtype Response: Decodable
(...)
}
extension APIResource {
func decode(_ data: Data) -> AnyPublisher<Response, APIError> {
Just(data)
// how can I access context here to pass it to JSONDecoder?
.decode(type: Response.self, decoder: JSONDecoder())
.mapError { error in
.parsing(description: error.localizedDescription)
}
.eraseToAnyPublisher()
}
}
Другое решение, которое я видел, состоит в том, чтобы использовать синглтон. Я могу получить к нему доступ из любой точки проекта, позвонив по номеру CoreDataStack.shared.context
. Но это хорошее решение?
А что, если я не хочу изменять какой-либо объект в основной и фоновой очереди одновременно? Я думаю, что если я сохраню объекты в одной очереди и прочту их в другой, это не будет проблемой. Но что, если обе очереди захотят изменить их?