TABObserverSet 2.1.0

TABObserverSet 2.1.0

测试已测试
语言语言 SwiftSwift
许可证 BSD
发布日期最后发布2018年1月
SwiftSwift版本4.0
SPM支持SPM

由Kane Cheshire、Oliver Dew、Sam Dods维护。



  • 作者
  • Kane Cheshire




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许可证下提供。有关更多信息和许可证文件。