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

Posted

技术标签:

【中文标题】访问全局函数内的环境变量 - SwiftUI + CoreData【英文标题】:Access environment variable inside global function - SwiftUI + CoreData 【发布时间】:2020-05-12 00:57:19 【问题描述】:

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

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

import SwiftUI
import CoreData

class GlobalVariableClass: ObservableObject 
   @Published var itemObjects: [NSManagedObject] =  []

在 SceneDelegate 中放置了一个类的实例

class SceneDelegate: UIResponder, UIWindowSceneDelegate 

   var globalVariables = GlobalVariableClass()

   ...

将实例传递给 contentView

let contentView = Home()
         .environmentObject(globalVariables)
         .environment(\.managedObjectContext, context)

现在,当我在任何视图中声明@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)")
   

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

虽然如果我在listItem视图中声明加载函数,声明环境对象globalVariables,然后改成

do 
      globalVariables.itemObjects = try managedContext.fetch(fetchRequest)
   

然后一切正常。

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

【问题讨论】:

【参考方案1】:

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

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

   @Published var itemObjects: [NSManagedObject] =  []

所以你可以使用它

class SceneDelegate: UIResponder, UIWindowSceneDelegate 

   var globalVariables = GlobalVariableClass.shared

   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)")
   

【讨论】:

你是一个美丽的人,工作很愉快!只是想知道,当您使用 GlobalVariableClass.shared 时,为什么在 GlobalVariableClass 之后不需要括号?第一次看到。 @altec,因为shared 是静态的,所以属于类,而不是实例。

以上是关于访问全局函数内的环境变量 - SwiftUI + CoreData的主要内容,如果未能解决你的问题,请参考以下文章

访问函数内覆盖的全局变量

访问函数内覆盖的全局变量

全局变量与参数

SwiftUI - 如何创建全局 @State 变量?

从匿名函数汇编脚本访问全局变量

angular 4/socket.io 访问全局变量和函数调用