Core data 移动fetch req并将核心数据更新到模型
如何将获取请求和更新值从核心数据移动到模型中 我有核心数据,比如登录数据(userToken、isLogin和userType)。我需要在2视图中显示和更新此数据。所以我需要多次创建更新、保存和获取请求。可能在登录视图和配置文件视图中 是否可以使用模型从我的核心数据更新、保存、删除和获取请求Core data 移动fetch req并将核心数据更新到模型,core-data,swiftui,Core Data,Swiftui,如何将获取请求和更新值从核心数据移动到模型中 我有核心数据,比如登录数据(userToken、isLogin和userType)。我需要在2视图中显示和更新此数据。所以我需要多次创建更新、保存和获取请求。可能在登录视图和配置文件视图中 是否可以使用模型从我的核心数据更新、保存、删除和获取请求 import SwiftUI struct LoginView: View { @State var isNavigationBarHidden: Bool = true @Environment
import SwiftUI
struct LoginView: View {
@State var isNavigationBarHidden: Bool = true
@Environment(\.managedObjectContext) private var viewContext
@FetchRequest(sortDescriptors: [])
private var userData: FetchedResults<LoginData>
var body: some View {
ZStack {
Color.green
Button(action: {
setLogin()
}){
Text("Login Screen")
.foregroundColor(Color.black)
}
}
.navigationBarTitle("Hidden Title")
.navigationBarHidden(self.isNavigationBarHidden)
.onAppear {
self.isNavigationBarHidden = true
}
}
private func saveContext() {
do {
try viewContext.save()
} catch {
let error = error as NSError
fatalError("Unresolved error \(error)")
}
}
private func setLogin(){
let newUser = LoginData(context: viewContext)
newUser.isLogin = true
newUser.userToken = "JWT_TOKEN"
saveContext()
}
}
struct LoginView_Previews: PreviewProvider {
static var previews: some View {
LoginView()
}
}
为了让事情变得更简单,您可以在
observateObject
中存储一个持久化容器
类发布者:observeObject{
静态让共享:Publisher=Publisher()
let容器:nspersistent容器
lazy var context=container.viewContext
@已发布的var isLoading:Bool=false
init(){
self.container=NSPersistentContainer(名称:“CoreDataModelName”)
container.loadPersistentStores{(storeDescription,错误)位于
如果let error=错误为N错误{
fatalError(“未解决的错误:\(错误)”)
}
}
}
}
然后使用环境
视图修饰符将其设置为managedObjectContext
尝试在视图层次结构中尽早设置此选项,以便其他视图可以访问它
struct ContentView:View{
@StateObject//或@ObservedObject
var publisher:publisher=.shared
var body:一些观点{
文本(“你好,世界!”)
//在此处设置“managedObjectContext”
.environment(\.managedObjectContext,publisher.context)
}
}
然后,您应该可以跨多个视图访问视图上下文:
struct ChildView:View{
@环境(\.managedObjectContext)
private var viewContext//使用环境对象`managedObjectContext`
@FetchRequest(排序描述符:[])
私有变量对象:FetchedResults
var body:一些观点{
文本(“你好,世界!”)
}
private func saveContext(){
做{
请尝试viewContext.save()
}抓住{
let error=错误为N错误
fatalError(“未解决的错误\(错误)”)
}
}
private func saveObject(){
让对象=对象(上下文:viewContext)
saveContext()
}
}
并且,还可以在您的ObservieObject
类中访问:
扩展发布程序{
///用于更新应用程序当前状态的函数。
函数更新(uu执行:(()->Void)?=nil){
DispatchQueue.main.async{[self]位于
isLoading=true
执行?()
isLoading=错误
}
}
func saveContext(){
在中更新{[self]
做{
尝试context.save()
}抓住{
let error=错误为N错误
debugPrint(错误。本地化描述)
}
}
}
func保存(对象:对象){
context.insert(对象)
saveContext()
}
func delete(对象:对象){
context.delete(对象)
saveContext()
}
}
CoreData对象是一种模型级引用类型的对象,您可以在运行时通过引用随时随地移动它们。我已经更新了我的问题。我可能完全错了,但感觉您有两个不同的托管对象上下文,即使它们都是从同一环境生成的。您是否尝试过将托管对象从视图传递到模型?或者只是将适当的数据添加到模型中,让它创建并保存MO?
@Environment(\.managedObjectContext) private var viewContext
@FetchRequest(sortDescriptors: [])
private var userData: FetchedResults<LoginData>
private func saveContext() {
do {
try viewContext.save()
} catch {
let error = error as NSError
fatalError("Unresolved error \(error)")
}
}
private func setLogin(){
let newUser = LoginData(context: viewContext)
newUser.isLogin = true
newUser.userToken = "JWT_TOKEN"
saveContext()
}
import SwiftUI
class UserDataModel: ObservableObject {
@Environment(\.managedObjectContext) private var viewContext
@FetchRequest(sortDescriptors: [])
var loginData: FetchedResults<LoginData>
func saveContext() {
do {
try viewContext.save()
} catch {
let error = error as NSError
fatalError("Unresolved error \(error)")
}
}
func setLogin(){
let newUser = LoginData(context: viewContext)
newUser.isLogin = true
newUser.userToken = "JWT_TOKEN"
saveContext()
}
func setLogout(){
viewContext.delete(loginData[0])
saveContext()
}
}
Thread 1: Fatal error: Unresolved error Foundation._GenericObjCError.nilError