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

Swift 如何在不同实例之间共享对象的状态?,swift,state,observers,Swift,State,Observers,哎,, 我正在努力提高我的发展技能,遇到了一些困难。我在SwiftBySundell.com上读到了Swift中的观察家,现在我想改进我目前正在开发的应用程序 这个应用程序很简单:你按下一个按钮,一个时间戳就会保存到CoreData数据库中 所以我得到了一个带有按钮的视图和一个带有一些功能的模型。 在我看来,当按下按钮时,我的模型计时器的状态应该从.idle变为.started 我在下面添加了一些代码,说明如何实现这一目标 现在,当Sundell在解释我应该如何以4种不同的方式实现观察器时,我似

哎,, 我正在努力提高我的发展技能,遇到了一些困难。我在SwiftBySundell.com上读到了Swift中的观察家,现在我想改进我目前正在开发的应用程序

这个应用程序很简单:你按下一个按钮,一个时间戳就会保存到CoreData数据库中

所以我得到了一个带有按钮的视图和一个带有一些功能的模型。 在我看来,当按下按钮时,我的模型计时器的状态应该从.idle变为.started

我在下面添加了一些代码,说明如何实现这一目标

现在,当Sundell在解释我应该如何以4种不同的方式实现观察器时,我似乎对实际发生的事情缺乏一些理解

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

总结一下我的问题:我如何在我的观点中最好地接受我的时间机器的共享状态?即使有了观察者,他们是否只在类的同一个实例上工作

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

每次我进入下一个视野时,我真的必须通过tM吗

进口基金会 类计时器{ var state=state.idle{ didSet{stateDidChange} } 功能状态改变{ 打印当前状态为\状态 } 枚举状态{ 空箱 案件开始 案件暂停 } } 设tM=计时器 设tM2=计时器 tM.state=.idle //该州现在处于闲置状态 tM.state=.started //国家现在开始了 printtM2状态为:\tM2.State //tM2状态为:空闲
看来你完全忽略了参考资料的概念。某个类有两个不同的实例。当您在第一个实例上设置属性时,不能期望在第二个实例上被称为某个属性的观察者。这些例子没有什么共同之处

由于类是引用类型,所以可以在视图中传递时间机器的同一实例的引用。您可以使用方法、闭包、变量等

所以,您需要相同的实例

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

如果我理解正确,您想知道如何在整个应用程序中正确共享状态,在本例中是您的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对象的引用。此外,我认为观察者模式在这个问题上并不适用,除非我误解了其中的一部分。

嘿,是的,我确实理解这个概念!我只是觉得有一种不同的方式。那么,创建tM实例,然后将其传递到下一个视图,然后再传递回来?是正确的方法吗?@UMPUSTEN嘿,这取决于很多东西。有太多的选择…还有什么其他选择?你有没有什么我能读到的东西可以更好地理解?@UMPUSTEN也许在你的问题中能更好地描述你的实际问题没有问题可以说出来。只是我想添加一个不同的视图,它应该知道我的时间机器的状态。那么,目前的时间记录与否呢。假设我想在下一个视图中显示一个小计时器,显示我按下按钮后经过的秒数。如果这不能更好地解释我的问题,我将在今晚晚些时候上传我的代码。嘿,马克,谢谢你的回答。我想你在一定程度上正确地理解了我。让我试着更具体一点:Sundell在这里描述的方法之一是:使用协议作为观察者。现在,使用observer协议的每个类都可以订阅对状态所做的任何更改。然而,我不确定这种状态的变化是如何被传递回去的,并被全班注意到的。对我来说,这个信息在他的博客帖子中丢失了。我担心我缺乏一些背景知识。也许我应该带头做这个。虽然我的用例很小,但我可以做得太多。我只是想变得更好,我必须从某个地方开始;哦,好的。首先,您不使用协议作为观察者,而是使用协议或OOP术语指定一个类/实例化对象所遵循的接口。对象Q实现协议W,该协议承诺存在函数print->String。简而言之,在这种情况下,它意味着一个对象a有一个对象列表,所有对象都有一个函数didStar
tPlaying。然后,对象A可以迭代并在每个对象上调用didStartPlaying。我建议阅读一些关于OOP的教科书:嗨,在这个例子中,他的类向自己的AudioPlayer.addObserverself实例添加了一个观察者。现在,player实例具有该类的id,并且可以在状态更改时进行迭代。但是,这仍然只适用于AudioPlayer的同一实例?!!另一个isntance将不会有包含所有观察者id的观察词典……那么,这样做的首要目的是什么?我仍然需要以其他方式共享该实例……然后我可以自己检查状态,而无需所有工作。我遗漏了什么?你误解了模式的目的,观察者模式的目的是在你不知道何时向对象请求状态时获取状态更新。例如,当您有一个音频播放器,并且希望在用户按下停止键时显示菜单时。您可以创建一个轮询机制,每毫秒检查一次AudioPlayer实例的状态,并在isStopped=false时显示一个菜单。正如你所理解的,这是对资源的浪费,而且很难遵循。这就是观察者模式的用武之地。