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()
        }
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • C++运算符重载-上篇 本章内容:1. 运算符重载的概述2. 重载算术运算符3. 重载按位运算符和二元逻辑运算符4...
    Haley_2013阅读 6,835评论 0 51
  • 本章将会介绍 模块和源文件访问级别访问控制语法自定义类型子类常量、变量、属性、下标构造器协议扩展泛型类型别名位运算...
    寒桥阅读 4,457评论 0 2
  • 高级运算符 文档地址 作为 基本运算符 的补充,Swift 提供了几个高级运算符执行对数传值进行更加复杂的操作。这...
    hrscy阅读 4,312评论 0 2
  • 本文参加#未完待续,就要表白#活动,本人承诺,文章内容为原创,且未在其他平台发表过。 表白我的大学———南信大...
    布丁大王阅读 1,657评论 0 3
  • 新技术,开放,硅谷之火 抽空看完了雷军所说的刺激他开始创业的硅谷之火,前半段是计算机产业形成初期纷乱繁杂的创业市场...
    IanWang阅读 2,767评论 0 1

友情链接更多精彩内容