ObservableEvent 2.0.0

ObservableEvent 2.0.0

测试已测试
语言语言 SwiftSwift
许可证 Apache 2
发布最后发布2017年4月
SwiftSwift 版本3.0
SPM支持 SPM

Tom Kier 维护。



  • Tom Kier

ObservableEvent

关于

ObservableEvent 是在 Swift 中实现的一个简单观察者模式。有关 ObservableEvent 的创建原因和背后的思考,请参见博客文章: Swift 中的 ObservableEvent

安装

可以使用 CocoaPods 安装 ObservableEvent 框架。将以下行添加到您的项目 pod 文件,然后运行“pod install”。

 pod 'ObservableEvent', '~> 2.0.0'

使用 ObservableEvent

创建 ObservableEvent

要创建一个可观察的事件,创建 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

除非根据适用法律或书面同意,否则在许可下分发的软件是在“按现状”基础上分发的,不提供任何明示或暗示的保证或条件。有关许可的具体语言管理权限和限制,请参阅许可证。