将类传递给 .environmentObject 修饰符是否相当于创建一种单例?

问题描述 投票:0回答:1

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

两个问题:

  1. 它会产生和单例一样的效果,对吧?它位于内存中,当结果到来时会运行闭包
    runOnPurchase
    runOnFailure
    ,对吗?
  2. 通过使用@Environment包装器检索它,
    myAppStoreClass
    可以在任何一个类和视图上使用吗?
swift swiftui singleton environmentobject
1个回答
0
投票

不,

.environmentObject()
只是为了方便,让您不必将
ObservableObject
传递到每个视图中,直到到达需要的视图。因此,您可以将
.environmentObject
设置在顶层,然后在底层访问它查看您需要的内容。也可以在向下的过程中覆盖对象,但这是一项高级功能。

就您的目的而言,听起来您可能根本不需要对象。看看

EnvironmentKey
也许你可以用它?还有一个有趣的内置控制器结构
AuthorizationController
被定义为键。

© www.soinside.com 2019 - 2024. All rights reserved.