首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将EnvironmentObject传递给EnvironmentObject中的ObservedObject?

如何将EnvironmentObject传递给EnvironmentObject中的ObservedObject?
EN

Stack Overflow用户
提问于 2021-01-10 09:01:08
回答 1查看 24关注 0票数 1

我有一个名为GameManager()EnvironmentObject,它基本上是我的应用程序的根:

代码语言:javascript
复制
class GameManager: ObservableObject {
    @ObservedObject var timeManager = TimeManager()

因为其中有很多代码,所以我想将某些任务委托到单独的类/文件中。

例如,我想创建一个每秒运行的计时器。这可以很容易地在GameManager()中运行,但我想把它委托给一个名为TimeManager()的单独类

代码语言:javascript
复制
class TimeManager: ObservableObject {
    @EnvironmentObject var gameManager: GameManager
    var activeGameTimer: Timer?
    @Published var activeGameSeconds: Int = 0
    
    func start(){
        self.activeGameTimer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true){ _ in
            self.activeGameSeconds += 1  
        }
    }
}

唯一的问题是,为了对游戏中的某些事件做出反应,TimeManager需要有一个对GameManager()的引用。

然而,似乎没有一种方法可以将GameManager()传递给TimeManager()

有没有一种顺利的方法来实现这一点?如果没有,有没有其他方法可以安排我正在尝试做的事情?

如果解决方案很陈词滥调,我宁愿不去做。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-01-10 12:57:19

首先,@ObservedObject@EnvironmentObject是为SwiftUI视图设计的属性包装器,而不是其他的,所以在类中使用它们可能是有害的,或者至少是无用的-它们的功能并不像您预期的那样。

现在你的场景的解决方案是依赖注入(两种类型都是引用类型,所以实例被注入为引用):

代码语言:javascript
复制
class GameManager: ObservableObject {
    var timeManager: TimeManager!

    init() {
       timeManager = TimeManager(gameManager: self)
    }
    // ... other code
}

class TimeManager: ObservableObject {
    var gameManager: GameManager

    var activeGameTimer: Timer?
    @Published var activeGameSeconds: Int = 0

    init(gameManager: GameManager) {
       self.gameManager = gameManager
    }

    // ... other code
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65649205

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档