do運算

do運算符功能描述如下:


do運算符概念
extension ObservableType {
    /**
    Invokes an action for each event in the 
    observable sequence, and propagates all observer 
    messages through the result sequence.
    */
    public func doOn(eventHandler: (Event<E>) throws ->Void)->Observable<E> {
        return Do(source: self.asObservable(), eventHandler: eventHandler)
    }

    public func doOn(onNext onNext: (E throws ->Void)? = nil, onError:(ErrorType throws ->Void)? = nil, onCompleted:(() throws ->Void)? = nil)->Observable<E> {
        return Do(source: self.asObservable()) { e in
            switch e {
                case .Next(let element):
                    try onNext?(element)
                case .Error(let e):
                    try onError?(e)
                case .Completed:
                    try onCompleted?()
            }
        }
    }

    public func doOnNext(onNExt: (E throws->Void))->Observable<E> {
        return self.doOn(onNext: onNext)
    }

    public func doOnError(onError: (ErrorType throws->Void))->Observable<E> {
        return self.doOn(onError: onError)
    }

    public func doOnCompleted(onCompleted: (() throws ->Void))->Observable<E> {
        return self.doOn(onCompleted: onCompleted)
    }
}

class Do<Element>: Producer<Element> {
    typealias EventHandler = Event<Element> throws->Void

    private let _source: Observable<Element>
    private let _eventHandler: EventHandler

    init(source: Observable<Element>, eventHandler: EventHandler) {
        _source = source
        _eventHandler = eventHandler
    }

    override func fun<O: ObserverType where O.E == Element>(observer: O)->Disposable {
        let sink = DoSink(parent: self, observer: observer)
        sink.disposable = _source.subscribe(sink)
        return sink
    }
}

class DoSink<O: ObserverType>: Sink<O>, ObserverType {
    typealias Element = O.E
    typealias parent = Do<Element>

    private let _parent: Parent

    init(parent: Parent, observer: O) {
        _parent = parent
        super.init(observer: observer)
    }

    func on(event: Event<Element>) {
        do {
            try _parent._eventHandler(event)
            forwardOn(event)
            if event.isStopEvent {
                dispose()
            }
        }catch let error {
            forwardOn(.Error(error))
            dispose()
        }
    }
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • C++運算符重載-上篇 本章內容:1. 運算符重載的概述2. 重載算術運算符3. 重載按位運算符和二元邏輯運算符4...
    Haley_2013閱讀 2,318評論 0 51
  • 本章將會介紹 模塊和源文件訪問級別訪問控制語法自定義類型子類常量、變量、屬性、下標構造器協議擴展泛型類型別名位運算...
    寒橋閱讀 904評論 0 2
  • 高級運算符 文檔地址 作為 基本運算符 的補充,Swift 提供了幾個高級運算符執行對數傳值進行更加復雜的操作。這...
    hrscy閱讀 859評論 0 2
  • 本文參加#未完待續,就要表白#活動,本人承諾,文章內容為原創,且未在其他平臺發表過。 表白我的大學———南信大...
    布丁大王閱讀 220評論 0 3
  • 新技術,開放,硅谷之火 抽空看完了雷軍所說的刺激他開始創業的硅谷之火,前半段是計算機產業形成初期紛亂繁雜的創業市場...
    IanWang閱讀 352評論 0 1