通常只有一个ViewModel来管理所有Coredata实体-Core Data+ mvvm+斯威夫特
只有一个viewModel
来管理所有coredata
实体是否常见?
例如,在下面的示例中,我有三个核心数据实体,car
,carService
和serviceRecord
其中car
有许多汽车服务
,每个carservice
有许多servicerecords
。一切正常,但是我觉得我的carviewModel
文件正在增长和增长,我不确定这是否真的是一个很好的MVVM练习。
如下面的示例,您正在使用carviewModel
从core> core data
获取数据,并围绕SwiftUI视图传递。同样,一切都很好,但我觉得我缺少一些东西。
使用MVVM + Coredata + Swiftui
时,有人可以分享您通常如何构建代码的方式。您是否处理一个viewModel
如下所示的所有内容,还是通常为每个实体具有viewModel
?如果每个实体都是最佳选择,那么您使用哪种方法传递了SwiftUi视图周围的ViewModels?
coredatamanager
class CoreDataManager{
static let instance = CoreDataManager()
lazy var context: NSManagedObjectContext = {
return container.viewContext
}()
lazy var container: NSPersistentContainer = {
return setupContainer()
}()
func setupContainer()->NSPersistentContainer{
// code to setup container...
return container
}
func save(){
do{
try context.save()
}catch let error{
print("Error saving Core Data. \(error.localizedDescription)")
}
}
}
carviewModel
class CarViewModel: ObservableObject{
let manager: CoreDataManager
@Published var cars: [Car] = []
@Published var carServices: [CarService] = []
@Published var serviceRecords: [ServiceRecord] = []
init(coreDataManager: CoreDataManager = .instance){
self.manager = coreDataManager
// getCars() etc.
}
// CREATIONS
func addCar(name:String){}
func addService(name:String, cost: Double){}
func createRecord(name:String, cost: Double){}
// DELETES
func deleteCar(){}
func deleteCarService(){}
func deleteServiceRecord(){}
// UPDATES
func updateCar(){}
func updateService(){}
// GETS
func getCars(){}
func getServices(){}
func getRecords(){}
func save(){
self.manager.save()
}
}
swiftui视图
CARSVIEW
struct CarsView: View {
@StateObject var carViewModel = CarViewModel()
var body: some View {
NavigationView{
VStack{
List {
ForEach(carViewModel.cars) { car in
}
}
}
}
}
}
SERVICEVIEW
struct ServicesView: View {
@ObservedObject var carViewModel:CarViewModel
var body: some View {
NavigationView{
VStack{
List {
ForEach(carViewModel.carServices) { service in
}
}
}
}
}
}
RECORDVIEW
struct RecordsView: View {
@ObservedObject var carViewModel: CarViewModel
var body: some View {
NavigationView{
VStack{
List {
ForEach(carViewModel.serviceRecords) { record in
}
}
}
}
}
}
Is it common to have only one ViewModel
to manage all CoreData
entities?
For instance, in the following example, I have three Core Data entities, Car
, CarService
and ServiceRecord
where Car
has many carServices
and each CarService
has many serviceRecords
. Everything is working fine but I feel like my CarViewModel
file is growing and growing and I'm not sure if this is really a good MVVM practice.
As you can see in the following example I'm using CarViewModel
to fetch data from Core Data
and passing it around SwiftUI views. Again, everything is working fine but I feel like I'm missing something.
Can someone please share how you usually structure your code when using MVVM + CoreData + SwiftUI
. Do you handle everything from one ViewModel
as shown below or do you usually have a ViewModel
for each entity? If a viewModel per each entity is the best option, what method do you use to pass viewModels around SwiftUI views?
CoreDataManager
class CoreDataManager{
static let instance = CoreDataManager()
lazy var context: NSManagedObjectContext = {
return container.viewContext
}()
lazy var container: NSPersistentContainer = {
return setupContainer()
}()
func setupContainer()->NSPersistentContainer{
// code to setup container...
return container
}
func save(){
do{
try context.save()
}catch let error{
print("Error saving Core Data. \(error.localizedDescription)")
}
}
}
CarViewModel
class CarViewModel: ObservableObject{
let manager: CoreDataManager
@Published var cars: [Car] = []
@Published var carServices: [CarService] = []
@Published var serviceRecords: [ServiceRecord] = []
init(coreDataManager: CoreDataManager = .instance){
self.manager = coreDataManager
// getCars() etc.
}
// CREATIONS
func addCar(name:String){}
func addService(name:String, cost: Double){}
func createRecord(name:String, cost: Double){}
// DELETES
func deleteCar(){}
func deleteCarService(){}
func deleteServiceRecord(){}
// UPDATES
func updateCar(){}
func updateService(){}
// GETS
func getCars(){}
func getServices(){}
func getRecords(){}
func save(){
self.manager.save()
}
}
SwiftUI Views
CarsView
struct CarsView: View {
@StateObject var carViewModel = CarViewModel()
var body: some View {
NavigationView{
VStack{
List {
ForEach(carViewModel.cars) { car in
}
}
}
}
}
}
ServicesView
struct ServicesView: View {
@ObservedObject var carViewModel:CarViewModel
var body: some View {
NavigationView{
VStack{
List {
ForEach(carViewModel.carServices) { service in
}
}
}
}
}
}
RecordsView
struct RecordsView: View {
@ObservedObject var carViewModel: CarViewModel
var body: some View {
NavigationView{
VStack{
List {
ForEach(carViewModel.serviceRecords) { record in
}
}
}
}
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
我个人将创建一个服务文件,该文件将所有功能都保存在给定模型中。然后,我只会在我的ViewController所需的ViewModel中揭示功能。
例如:
carservice.swift
carviewmodel.swift
carviewcontroller.swift
这当然只是一种方法,我相信没有“正确”结构代码的方法。
希望它有帮助
Personally I would create a service file which holds all the functions to a given model. I would then only expose the functions in my viewModel that my viewController needs.
For example:
CarService.swift
CarViewModel.swift
CarViewController.swift
This is of course just one way to go about it, I believe there is no 'right' way to structure your code.
Hope it helps