【发布时间】:2020-05-03 09:02:18
【问题描述】:
我正在使用MVVM 模式编写应用程序。我想知道如何创建 CoreData 堆栈,以便可以从我的应用程序中的各个位置访问它。
第一种方法是在AppDelegate 中创建一个持久容器,然后将此服务注入我的 ViewModel(同时将managedObjectContext 作为环境变量传递给我的 View)。
但是,通过这种方式访问整个应用程序的上下文更加困难:例如在解码网络响应时,因为他们无权访问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()
}
}
我见过的另一个解决方案是使用单例。我可以从项目中的任何位置访问它,但我如何以正确的方式创建它?
如果我不想同时修改 main 和 background 队列中的某个对象怎么办?或者如果两个队列都想修改同一个对象怎么办?
【问题讨论】:
-
不是一个实际的答案,而是思考的食物:恕我直言,在解码网络响应时使用核心数据不是正确的方法。我宁愿使用DTOs,然后将转换和存储它们的责任留给其他人。
-
对于那些想知道如何将上下文注入 View 和 View Model,stackoverflow.com/q/63959960/2226315
标签: ios swift core-data singleton