在全局函数中访问环境变量 - SwiftUI + CoreData [英] Access environment variable inside global function - 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屋!