如何跨不同实例共享对象的状态?

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

嘿,我正在努力提高自己的开发技能并遇到一些困难。我在SwiftBySundell.com上阅读了关于Swift的Observers,现在想要改进我目前正在开发的应用程序。

该应用程序很简单:您按一个按钮,时间戳保存到CoreData数据库。

所以我得到了一个带按钮的视图和一个带有一些功能的模型。在我看来,当按下按钮时,我的模型状态(TimeMachine)应该从让我们说.idle到.started。

我在下面添加了一些关于如何实现这个问题的代码。观察员。

现在,虽然Sundell正在解释我为实现Observers所必须做的事情(以4种不同的方式),但我似乎对实际发生的事情缺乏了解。

特别是当我想创建一个新视图时,它还将创建一个TimeMachine实例。 (这不是这样做的方法吗?我应该将对象传递给视图而不是创建一个新的吗?)

总结一下我的问题:如何在我的观点中实现我的Time Machine的最佳共享状态?即使有了观察员,他们只在同一个班级的实例上工作吗?

编辑:我知道对象是什么,两个实例是不同的。但是,有可能创建一个静态变量吗?我只想弄清楚正确的做事方式。

每次我转到下一个视图时,我是否真的需要传递tM?

import Foundation

class TimeMachine {
    var state = State.idle {
        didSet { stateDidChange() }
    }

    func stateDidChange() {
        print("The State is now \(state)")
    }

    enum State{
        case idle
        case started
        case paused
    }
}

let tM = TimeMachine()
let tM2 = TimeMachine()

tM.state = .idle
//The State is now idle
tM.state = .started
//The State is now started

print("tM2 State is: \(tM2.state)")
//tM2 State is: idle

swift state observers
2个回答
1
投票

看起来你错过了引用的整个想法。你有一些类的两个不同的实例。在第一个实例上设置属性时,您不能指望第二个实例将被称为某个属性的观察者。这些实例没什么共同之处。

由于类是引用类型,因此您可以在视图中传递TimeMachine的相同实例的引用。你可以使用方法,闭包,变量,......

所以,你需要相同的实例

let tM = TimeMachine()
tM.state = .started // prints "The State is now \(state)"

0
投票

如果我理解正确,你想知道如何在你的应用程序中“正确”分享状态,在这种情况下你的TimeMachine实例?有很多方法可以解决这个问题,这里有几种方法。

使用依赖注入:

  • 在导航上传递对象
  • 使用依赖注入库,或编写自己的库。

从可用数据生成正确的TimeMachine实例。 (虽然我不认为这可能在这个用例中)。

使用单例,扩展Time Machine以包含静态共享变量。

class TimeMachine {
    static let TimeMachine shared = TimeMachine()

    var state = State.idle {
        didSet { stateDidChange() }
    }

    func stateDidChange() {
        print("The State is now \(state)")
    }

    enum State{
        case idle
        case started
        case paused
    }
}

恕我直言,你应该在这种情况下传递对TimeMachine对象的引用。此外,我不认为观察者模式真的适用于这个问题,除非我误解了它的一部分。

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