如何在SwiftUI MVVM ViewModel中传递/获取Core Data上下文? [英] How to pass/get Core Data context in SwiftUI MVVM ViewModel?

查看:355
本文介绍了如何在SwiftUI MVVM ViewModel中传递/获取Core Data上下文?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

上下文

要对核心数据对象进行性能操作,托管对象上下文 managedObjectContext 为需要。当使用使用核心数据生成项目时,上下文通过 SceneDelegate 中的环境变量传递到View中。选项已选中(请参见下文)。一个相关的问题是为什么

To performance operation on the Core Data object, the managed object context managedObjectContext is needed. The context is passed into View via the environment variable inside SceneDelegate when the project is generated with the "using Core Data" option checked (see below). A related question is Why does Core Data context object have to be passed via environment variable?

let contentView = MainView().environment(\.managedObjectContext, context)

但是,当我尝试将 context 传递给视图模型,它会抱怨以下问题

However, when I try to pass the context into the View Model, it complains the following


不能在属性初始化器中使用实例成员 context;属性初始值设定项在'self'可用之前运行

Cannot use instance member 'context' within property initializer; property initializers run before 'self' is available


struct MainView: View {
    @Environment(\.managedObjectContext) var context
    
    // Computed property cannot be used because of the property wrapper
    @ObservedObject var viewModel = ViewModel(context: context)
}

class ViewModel: ObservableObject {
    var context: NSManagedObjectContext
}

添加 init()初始化视图内的视图模型会导致另一个错误,导致构建失败。

Adding an init() to initialize the view model inside the view causes a different error which fails the build.


无法产生表达诊断;请提交错误报告

Failed to produce diagnostic for expression; please file a bug report


    init() {
        self.viewModel = ViewModel(context: context)
    }

问题

那么,如何使用/获取/传递视图模型中的上下文?在视图模型中获取上下文的更好方法是什么?

So how can I use / get / pass the context inside the view model? What's the better way to get a context inside the view model?

推荐答案

这是您的方案

let contentView = MainView(context: context)          // << inject
        .environment(\.managedObjectContext, context)

struct MainView: View {
    @Environment(\.managedObjectContext) var context

    @ObservedObject private var viewModel: ViewModel // << declare

    init(context: NSManagedObjectContext) {
        self.viewModel = ViewModel(context: context)   // initialize
    }
}

这篇关于如何在SwiftUI MVVM ViewModel中传递/获取Core Data上下文?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆