如何在不同实例之间共享对象的状态?

时间:2019-04-02 13:51:02

标签: swift state observers

, 我正在努力提高自己的开发技能,遇到了一些困难。我在SwiftBySundell.com上了解了Swift中的Observers,现在想改进我目前正在使用的应用程序。

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

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

我在下面添加了一些有关如何实现此目标的代码。观察者。

现在,当Sundell在解释实现观察者所需要做的事情(以4种不同的方式)时,我似乎对实际发生的事情缺乏了解。

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

总结我的问题:如何在我的视图中最好地了解TimeMachine的共享状态?并且即使有观察者在位,他们也只能在类的同一实例上工作吗?

编辑:我确实知道什么是对象,并且两个实例是不同的。 但是,是否有可能创建一个静态变量? 我只是想找出做事的正确方法。

我每次向下一个视图求助时,是否真的必须通过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

2 个答案:

答案 0 :(得分:1)

似乎您缺少参考的全部概念。您有某个类的两个不同实例。您不能期望在第一个实例上设置属性时在第二个实例上将被称为某个属性的观察者。这些实例并不常见。

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

因此,您需要相同的实例

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

答案 1 :(得分:0)

如果我对您的理解正确,那么您想知道如何在应用程序(在这种情况下为TimeMachine实例)中“正确”共享状态吗?有很多解决方法,以下是几种方法。

使用依赖注入:

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

根据可用数据生成正确的TimeMachine实例。 (但我认为在这种用例中这是不可能的。)

使用单例,将TimeMachine扩展为包含静态共享变量。

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对象。另外,除非我误解了Observer模式,否则我认为它在该问题上并不适用。