访问全局函数内的环境变量 - SwiftUI + CoreData

alt*_*tec 2 xcode core-data swift swiftui

我正在开发一个列表应用程序,并且我有一些针对一种特定数据类型的添加/删除/编辑/加载功能,但是我想概括这些功能,这样我就可以从内部对任何数据类型执行相同的操作任何观点。

我已经设置了一个全局变量类:

import SwiftUI
import CoreData

class GlobalVariableClass: ObservableObject {
   @Published var itemObjects: [NSManagedObject] =  []
}
Run Code Online (Sandbox Code Playgroud)

将类的实例放置在 SceneDelegate 中

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

   var globalVariables = GlobalVariableClass()

   ...
Run Code Online (Sandbox Code Playgroud)

将实例传递给 contentView

let contentView = Home()
         .environmentObject(globalVariables)
         .environment(\.managedObjectContext, context)
Run Code Online (Sandbox Code Playgroud)

现在,当我@EnvironmentObject var globalVariables: GlobalVariableClass在任何视图中声明时,我可以访问itemObjects它,它存储输入到文本字段中的所有项目。

这很棒,但我正在尝试使用不在视图内的全局函数。

我将它们声明在全局级别的单独文件中,以便它们具有公共访问权限。

确切的问题在下面的do块内部。

func loadItems() {

   guard let appDelegate =
      UIApplication.shared.delegate as? AppDelegate else {
         return
   }

   let managedContext =
      appDelegate.persistentContainer.viewContext

   let fetchRequest =
      NSFetchRequest<NSManagedObject>(entityName: "Item")

   do {
      GlobalVariableClass().itemObjects = try managedContext.fetch(fetchRequest)
   }   catch let error as NSError {
      print("Could not fetch. \(error), \(error.userInfo)")
   }
}
Run Code Online (Sandbox Code Playgroud)

访问 itemObjects 结果GlobalVariableClass().itemObjects 在我的应用程序中没有加载任何内容。

虽然如果我在 listItem 视图中声明 load 函数,声明环境对象globalVariables,然后将其更改为

do {
      globalVariables.itemObjects = try managedContext.fetch(fetchRequest)
   }
Run Code Online (Sandbox Code Playgroud)

然后一切都加载得很好。

关于如何从全局函数中访问 itemObjects 有什么建议吗?

Asp*_*eri 5

可能的方法是使用共享实例,例如

class GlobalVariableClass: ObservableObject {
   static var shared = GlobalVariableClass()     // << here !!

   @Published var itemObjects: [NSManagedObject] =  []
}
Run Code Online (Sandbox Code Playgroud)

所以你可以使用它

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

   var globalVariables = GlobalVariableClass.shared
Run Code Online (Sandbox Code Playgroud)

   do {
      let results = try managedContext.fetch(fetchRequest)

      // make sure to modify itemObjects always in main queue
      DispatchQueue.main.async {    // << must !!
         GlobalVariableClass.shared.itemObjects = results
      }
   }   catch let error as NSError {
      print("Could not fetch. \(error), \(error.userInfo)")
   }
Run Code Online (Sandbox Code Playgroud)