测试已测试 | ✓ |
语言语言 | SwiftSwift |
许可证 | BSD |
发布日期最后发布 | 2018年1月 |
SwiftSwift版本 | 4.0 |
SPM支持SPM | ✗ |
由Kane Cheshire、Oliver Dew、Sam Dods维护。
TABObserverSet
最初由Mike Ash构思,提供一个类似于传统NotificationCenter
风格的响应式编程的Swift变体。
它具有简单的语法,使TABObserverSet
易于在您的代码中使用和阅读。
如果您不使用Cocoapods,可以通过将《ObserverSet.swift》添加到项目的目标中来将TABObserverSet
集成到项目中。
使用非常简单。
类似于NotificationCenter
,您有一个单一的发布者和多个观察者。由于只有一个发布者,因此TABObserverSet
导致一对一的关系,而NotificationCenter
风格的播报可能会导致多对多的关系。
以下是一个设置发布者的方式
class NetworkPoller {
// Things that want to observe the broadcast can add themselves
// to this `ObserverSet`
let networkPollObservers = ObserverSet<Void>()
// ... some magic code here which polls ... //
private func networkPolled() {
// Broadcast to any observers that the network has polled
networkPollObservers.notify()
}
}
很简单,对吧?如果您对设置观察集合时Void
类型的作用感到好奇
ObserverSet<Void>()
这实际上意味着我们在通知观察者时不会传递任何参数。
您可以声明传递任何类型,如果您想的话。以下是一个传递可选错误并在通知观察者时传递的另一个示例
class NetworkPoller {
// Things that want to _subscribe_ to the _broadcast_ can add themselves
// to this `ObserverSet`
let networkPollObservers = ObserverSet<Error?>()
// ... some magic code here which polls ... //
private func networkPolled(_ error: Error?) {
// Broadcast to any observers that the network has polled
networkPollObservers.notify(error)
}
}
所以这就是设置发布者,那么观察者呢?这同样非常简单
let networkPoller = NetworkPoller()
class SettingsViewModel {
init() {
networkPoller.networkPollObservers.add(self, SettingsViewModel.networkPolled)
}
private func networkPolled(_ error: Error?) {
if let error = error {
print("Error! \(error)")
} else {
print("Network polled! :D")
}
}
}
class ResultsViewModel {
init() {
networkPoller.networkPollObservers.add(self, ResultsViewModel.networkPolled)
}
private func networkPolled(_ error: Error?) {
if let error = error {
print("Error! \(error)")
} else {
print("Network polled! :D")
}
}
}
在上面的示例代码中,我们有一个单一的共享NetworkPoller
实例(发布者),
以及两个想要在执行网络轮询时进行独自操作的视图模型,因此它们个别地观察事件。这与您在Swift中设置#selectors
的方式非常相似,但它要干净得多。
您也可以使用闭包来观察事件,这对于测试来说非常棒
func test_networkPoller_notifiesObservers() {
let networkPoller = NetworkPoller()
let expectation = self.expectation(description: "Wait for network to poll")
networkPoller.networkPollObservers.add { error in
XCTAssertNil(error)
expectation.fulfill()
}
waitForExpectations(timeout: 1)
}
TABObserverSet
是Mike Ash创建的SwiftObserverSet
的分支。
应感谢Mike Ash原创想法的灵感。
TABObserverSet
在MIT许可证下提供。有关更多信息和许可证文件。