测试已测试 | ✓ |
语言语言 | SwiftSwift |
许可证 | Apache 2 |
发布最后发布 | 2017年4月 |
SwiftSwift 版本 | 3.0 |
SPM支持 SPM | ✗ |
由 Tom Kier 维护。
ObservableEvent 是在 Swift 中实现的一个简单观察者模式。有关 ObservableEvent 的创建原因和背后的思考,请参见博客文章: Swift 中的 ObservableEvent
可以使用 CocoaPods 安装 ObservableEvent 框架。将以下行添加到您的项目 pod 文件,然后运行“pod install”。
pod 'ObservableEvent', '~> 2.0.0'
要创建一个可观察的事件,创建 ObservableEvent 类的实例。可观察事件使用正在观察的数据类型进行类型化。在通知观察者时,会将与该通知相关的数据类型的值发送给通知。
例如,一个游戏可能有一个在分数变化时通知观察者的可观察事件。由于分数是 Int 类型,创建 ObservableEvent 的代码如下所示:
let scoreChangedEvent = ObservableEvent<Int>()
可以创建一个可以通知观察者多个值的 ObservableEvent。只需使用元组作为泛型类型。例如
let scoreChangedEvent = ObservableEvent<(score:Int, isHighScore:Bool)>()
还可以创建不带任何类型的 ObservableEvents。只需使用 Void 作为泛型类型
let myEvent = ObservableEvent<Void>()
要通知所有事件观察者,请调用事件的 notifyObserv”。ers 方法并传递事件值。在我们的游戏分数示例中,我们可以调用所有观察者分数已更改,并将新分数传递给观察者的代码如下所示
scoreChangedEvent.notifyObservers(1000)
如果使用元组作为泛型类型
scoreChangedEvent.notifyObservers((score:25, isHighScore:false))
或者不带泛型类型
myEvent.notifyObservers()
要为事件添加观察者,请调用事件的 observe 方法,传递将在调用 notifyObservers 时调用的闭包。observe 调用返回一个 Disposeable 对象,该对象可以用于删除观察者(请参阅以下更多详细信息)。
在我们的游戏得分事件示例中,观察者可能看起来像
let scoreDisposable = scoreChangeEvent.observe { score in
// process new score
}
或者如果事件具有元组类型
let scoreDisposable = scoreChangeEvent.observe { score, isHighScore in
// process new score and isHighScore
}
或者如果事件使用 Void 作为泛型类型
let myEventDispsoable = myEvent.observe {
// event fired, do something
}
要删除观察者,请调用由 observe 方法返回的 Disposable 对象上的 dispose 方法。例如
scoreDisposable.dispose()
如果您正在观察多个事件并且有多个 Disposable 对象,则更方便一次性删除所有观察者,使用 DisposeBag。首先创建一个 DisposeBag 实例。然后在添加观察者时,通过调用 diposeWith(bag) 方法将返回的可处置对象添加到该包中。例如
let bag = DisposeBag()
scoreChangeEvent.observe { score, isHighScore in
// process new score and isHighScore
}.disposeWith(bag)
myEvent.observe {
// event fired, do something
}.disposeWith(bag)
现在当包被释放时,其所有内容将自动被处置,从而删除所有观察者。您还可以显式调用包本身的 dispose() 方法来处置其所有内容。
ObservableEvents 经常用来在特定变量变化时提供更改通知。它通常会看起来像
var score: Int = 0 {
didSet {
scoreChangedEvent.notififyObservers(score)
}
}
let scoreChangedEvent = ObservableEvent<Int>()
Property 类通过将变量实例和 ObservableEvent 结合成一个单独的类,提供了一个方便的实现此模式的方法。
要创建属性,创建一个 Property 类的实例,将初始值传递给初始化器。上面的得分示例可以使用属性如下实现
var score: Property(0)
要通过属性访问值,请使用其 value 属性
let currentScore = score.value
通过将其值赋给 value 属性来设置属性的值。每当设置属性的值时,它将自动通知所有观察者。
score.value = currentScore + 100
要将观察者添加到属性中,请调用其 observe 方法。它与 ObservableEvent 上的 observe 方法的工作方式相同,传递一个闭包并返回一个 Disposable
score.observe { score in
// process the score
}.disposeWith(bag)
关于属性的一个重要注意事项……观察者闭包将在 observe 方法被调用时立即以属性的当前值被调用。这意味着属性观察者将以属性的当前值和任何未来的值被调用。
版权 2017 Endless Wave Software LLC
在 Apache License 2.0 版本(“许可”)下授权;除非根据相关法律规定或书面同意外,不得使用此文件。您可以在以下位置获得许可证的副本:
https://apache.ac.cn/licenses/LICENSE-2.0
除非根据适用法律或书面同意,否则在许可下分发的软件是在“按现状”基础上分发的,不提供任何明示或暗示的保证或条件。有关许可的具体语言管理权限和限制,请参阅许可证。