嘿,我正在努力提高自己的开发技能并遇到一些困难。我在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
看起来你错过了引用的整个想法。你有一些类的两个不同的实例。在第一个实例上设置属性时,您不能指望第二个实例将被称为某个属性的观察者。这些实例没什么共同之处。
由于类是引用类型,因此您可以在视图中传递TimeMachine
的相同实例的引用。你可以使用方法,闭包,变量,......
所以,你需要相同的实例
let tM = TimeMachine()
tM.state = .started // prints "The State is now \(state)"
如果我理解正确,你想知道如何在你的应用程序中“正确”分享状态,在这种情况下你的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对象的引用。此外,我不认为观察者模式真的适用于这个问题,除非我误解了它的一部分。