我想在小部件中显示从 Core Data 获取的数据。但@FetchRequest不适用于小部件。
据我了解,我们必须创建一个应用程序组并创建一个共享的持久容器。
我想知道的是如何从共享的持久容器中读取(获取)小部件上的数据,或者简单地说,如何在小部件中显示从 Core Data 获取的数据。
我有一个使用 Core Data + CloudKit 堆栈的应用程序。(核心数据在设备之间同步。)。现在我想在 iOS 14 小部件中显示来自 Core Data 的数据(在 WidgetKit 目标中查看)。
\n我的目标是让小部件中的数据也是来自核心数据的实际数据:即 \xe2\x80\x94 用户更改了设备 A 上的记录,稍后在设备 B(带有小部件)上更改了小部件中表示的记录。
\n我应该怎么做:
\na)为主应用程序目标和小部件目标添加应用程序组功能;并在小部件目标中获取核心数据。
\nb) 在主应用程序目标中获取核心数据,保存到文件(plist?、JSON?),然后在小部件中使用该文件。
\nc)在主应用程序目标中获取核心数据,从小部件目标中获取该数据。(是否可以?)
什么才是最合理的方式呢?感谢您的任何建议。
\n语境
为了对 Core Data 对象进行性能操作,managedObjectContext需要托管对象上下文。在SceneDelegate选中“使用核心数据”选项的情况下生成项目时,上下文通过内部的环境变量传递到 View 中(见下文)。一个相关的问题是为什么必须通过环境变量传递核心数据上下文对象?
let contentView = MainView().environment(\.managedObjectContext, context)
Run Code Online (Sandbox Code Playgroud)
但是,当我尝试将 传递context到视图模型时,它会抱怨以下内容
不能在属性初始值设定项中使用实例成员“上下文”;属性初始值设定项在 'self' 可用之前运行
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
}
Run Code Online (Sandbox Code Playgroud)
添加一个init()来初始化视图内的视图模型会导致不同的错误,从而导致构建失败。
未能产生表达诊断;请提交错误报告
init() {
self.viewModel = ViewModel(context: context)
}
Run Code Online (Sandbox Code Playgroud)
题
那么如何在视图模型中使用/获取/传递上下文呢?在视图模型中获取上下文的更好方法是什么?