ReactiveCocoa 4 圖解之二——監聽器(Observer)

監聽器是在等候,或有能力等候來自信號的事件的任何東西。監聽器用可以接受事件(Event)的Observer類型表示。

監聽器可以使用回調版本的Signal.observe或者SignalProducer.start方法隱性創建。

—— ReactiveCocoa 框架概覽

其實,監聽器就是一個函數(function):Event<Value, Error> -> ()。在監聽器內部,這個函數叫做action。它接收一個事件對之進行處理:

public struct Observer<Value, Error: ErrorType> {
    public typealias Action = Event<Value, Error> -> ()

    public let action: Action

    public init(_ action: Action) {
        self.action = action
    }

    public init(failed: (Error -> ())? = nil, completed: (() -> ())? = nil, interrupted: (() -> ())? = nil, next: (Value -> ())? = nil) {
        self.init { event in
            switch event {
            case let .Next(value):
                next?(value)

            case let .Failed(error):
                failed?(error)

            case .Completed:
                completed?()

            case .Interrupted:
                interrupted?()
            }
        }
    }

    ......
}

監聽器的初始化方法有兩個,一個很直觀,一個稍微復雜一些。不過目的都一樣:你決定如何分別處理四種類型的事件,初始化方法把這個決定存在監聽器里。

監聽器的構成

2. 如何向監聽器發送事件



取得監聽器的引用后,可以用以下四個方法發送事件:

  1. sendNext(value: Value)
  2. sendFailed(error: Error)
  3. sendComplete()
  4. sendInterrupted()

發送事件,其實就是將事件的值(發送Next事件時)或錯誤(發送Failed事件時)作為參數調用監聽器的action

public struct Observer<Value, Error: ErrorType> {
    
    ......

    /// Puts a `Next` event into the given observer.
    public func sendNext(value: Value) {
        action(.Next(value))
    }

    /// Puts an `Failed` event into the given observer.
    public func sendFailed(error: Error) {
        action(.Failed(error))
    }

    /// Puts a `Completed` event into the given observer.
    public func sendCompleted() {
        action(.Completed)
    }

    /// Puts a `Interrupted` event into the given observer.
    public func sendInterrupted() {
        action(.Interrupted)
    }
}
向監聽器發送事件
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • Spring Cloud為開發人員提供了快速構建分布式系統中一些常見模式的工具(例如配置管理,服務發現,斷路器,智...
    卡卡羅2017閱讀 134,973評論 19 139
  • https://nodejs.org/api/documentation.html 工具模塊 Assert 測試 ...
    KeKeMars閱讀 6,403評論 0 6
  • 一個信號,由Signal類型表現,是可以被持續監視的一系列事件(events)。 信號一般用來表示“正在進行中”的...
    HetfieldJoe閱讀 4,757評論 16 21
  • ?平生不會相思,才會相思,便害相思。 ?生下來本是不會相思的,所以日后便會相思,故而便害了相思。一開始的相思來得熱...
    泛泛之檀閱讀 339評論 0 1
  • ListView的優化問題可以說是面試的必考題。我之前看過一遍視頻 Android必學-異步加載,感覺里面講解的知...
    mecury閱讀 13,147評論 9 64