在全局函数中访问环境变量 - SwiftUI + CoreData [英] Access environment variable inside global function - SwiftUI + CoreData

查看:37
本文介绍了在全局函数中访问环境变量 - SwiftUI + CoreData的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I'm working on a list app, and I have some add/delete/edit/load functions for one specific data type, however I'd like to generalise those functions, so I can perform those same operations on any datatype, from within any view.

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

I've setup a global variable class:

import SwiftUI
import CoreData

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

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

placed an instance of the class inside SceneDelegate

class SceneDelegate: UIResponder, UIWindowSceneDelegate {

   var globalVariables = GlobalVariableClass()

   ...

将实例传递给 contentView

passed the instance into contentView

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

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

Now when I declare @EnvironmentObject var globalVariables: GlobalVariableClass inside any view, I can access itemObjects, which stores all the items entered into a textfield.

这很好,但我正在尝试使用不在视图中的全局函数.

That's great, but I'm trying to work with global functions, which aren't inside a view.

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

I'm declaring them inside a separate file at the global level so they have public access.

确切的问题在下面的 do 块中.

The exact problem is below inside the do block.

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 不会在我的应用程序中加载任何内容.

Accessing itemObjects with the GlobalVariableClass().itemObjects results in nothing loading in my app.

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

Though if I declare the load function inside the listItem view, declare the environment object globalVariables, then change it to

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

然后一切都加载得很好.

then everything loads just fine.

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

Any suggestions on how I can access itemObjects from within global functions?

推荐答案

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

Possible approach is to use shared instance, like

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

这篇关于在全局函数中访问环境变量 - SwiftUI + CoreData的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆