Core data 移动fetch req并将核心数据更新到模型

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

如何将获取请求和更新值从核心数据移动到模型中

我有核心数据,比如登录数据(userToken、isLogin和userType)。我需要在2视图中显示和更新此数据。所以我需要多次创建更新、保存和获取请求。可能在登录视图和配置文件视图中

是否可以使用模型从我的核心数据更新、保存、删除和获取请求

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