Apple 喜欢单例,但单例被认为是不好的做法,我正在尝试从要转换为 SwiftUI 的应用程序中删除它们。
我有一个用于应用程序商店购买和恢复的单例,它在应用程序启动时初始化,并包含一个闭包,如果结果来自应用程序商店,将调用该闭包来更新数据库。更新与界面无关。
类似这样的事情
let myAppStoreSingleton = MyAppStoreSingleton.sharedInstante
myAppStoreSingleton.initialize(runOnPurchase: { success() }, runOnFailure: { failure() })
如您所知,结果将异步出现。
现在假设结果需要很长时间才能到达,并且用户认为发生了错误并移至另一个屏幕。没关系,因为单例存在于内存中,并且在结果到来时将运行其中一个闭包。
现在假设我创建一个常规类并将其作为
MyApp.swift
传递给 .environmentObject(MyAppStorePurchaseClass)
,如下所示:
let myAppStoreClass = MyAppStoreClass()
myAppStoreClass.initialize(runOnPurchase: { success() }, runOnFailure: { failure() })
将其添加到 MyApp.swift...
var body: some Scene {
WindowGroup {
ContentView()
.environmentObject(myAppStoreClass)
}
}
两个问题:
runOnPurchase
或 runOnFailure
,对吗?myAppStoreClass
可以在任何一个类和视图上使用吗?不,
.environmentObject()
只是为了方便,让您不必将 ObservableObject
传递到每个视图中,直到到达需要的视图。因此,您可以将 .environmentObject
设置在顶层,然后在底层访问它查看您需要的内容。也可以在向下的过程中覆盖对象,但这是一项高级功能。
EnvironmentKey
也许你可以用它?还有一个有趣的内置控制器结构 AuthorizationController
被定义为键。