美文网首页
withLatestFrom 运算

withLatestFrom 运算

作者: 幸运的小强本人 | 来源:发表于2016-03-12 21:01 被阅读30次
extension ObservableType {
    public func withLatestFrom<Second0: ObservableConvertibleType>(second: Second0)->Observable<Second0.E> {
        return WithLatestFrom(first: asObservable(), second: second.asObservable(), resultSelector: { $ 1} )
    }

    public func withLatestFrom<Second0: ObservableConvertibleType, ResultType>(second: Second0, resultSelector: (E, Second0.E) throws->ResultType) ->Observable<ResultType> {
        return WithLatestFrom(first: asObservable(), second: second.asObservable(), resultSelector: resultSelector)
    }
}

class WithLatestFrom<FirstType, SecondType, ResultType>: Producer<ResultType> {
    typealias ResultSelector = (FirstType, SecondType) throws -> ResultType

    private let _first: Observable<FirstType>
    private let _second: Observable<SecondType>
    private let _resultSelector: ResultSelector

    init(first: Observable<FirstType>, second: Observable<SecondType>, resultSelector: ResultSelector) {
        _first = first
        _second = second
        _resultSelector = resultSelector
    }

    override fun run<O: ObserverType where O.E = ResultType>(observer: O)->Disposable {
        let sink = WithLatestFromSink(parent: self, observer: observer)
        sink.disposable = sink.run()
        return sink
    }
}

class WithLatestFromSink<FirstType, SecondType, ResultType, O: ObserverType where O.E == ResultType>: Sink<O>, ObserverType, SynchronizedOnType, LockOwnerType {
    typealias Parent = WithLatestFrom<FirstType, SecondType, ResultType>
    typealias E = FirstType

    private let _parent : Parent

    var _lock = NSRecursiveLock()
    private var _latest: SecondType?

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

    func run()->Disposable {
        let sndSubscription = SingleAssignmentDisposable()
        let sndo = WithLatestFromSecond(parent: self, disposable: sndSubscription)

        sndSubscription.disposable = _parent._second.subscribe(sndo)
        let fstSubscription = _parent._first.subscribe(self)

        return StableCompositeDisposable.create(fstSubscription, sndSubscription)
    }

    func on(event: Event<E>) {
        synchronizedOn(event)
    }

    func _synchronized_on(event: Event<E>) {
        switch event {
        cae let .Next(value):
            guard let latest = _latest else {return}
            do {
                let res = try _parent._resultSelector(value, latest)
                forwardOn(.Next(res))
            }catch let e {
                forwardOn(.Error(e))
                dispose()
            }
        case .Completed:
            forwardOn(.Completed)
            dispose()
        case let .Error(error):
            forwardOn(.Error(error))
            dispose()
        }
    }
}    

class WithLatestFromSecond<FirstType, SecondType, ResultType, O: ObserverType where O.E == ResultType>: ObserverType, LockOwnerType, SynchronizedOnType {
    typealias Parent = WithLatestFromSink<FirstType, SecondType, ResultType, O>
    typealias E = SecondType

    private let _parent: parent
    private let _disposable: Disposable

    var _lock: NSRecursiveLock {
        get {
            return _parent._lock
        }
    }

    init(parent: parent, disposable: Disposable) {
          _parent = parent
          _disposable = disposable
    }

    func on(event: Event<E>) {
        _synchronized_on(event)
    }

    func _synchronized_on(event: Event<E>) {
        switch event {
        case let .Next(value):
            _parent._latest = value
        case .Completed:
            _disposable.dispose()
        case let .Error(error):
            _parent.forwardOn(.Error(error))
            _parent.dispose()
        }
    }
}

相关文章

  • withLatestFrom 运算

  • withLatestFrom

    这个操作符是一种 AND 操作符,就是将2个流合并成一个流,根据其作用实际上可以称之为 mapWithLatest...

  • RxJs 操作符 withLatestFrom 在 SAP 电商

    看下面这段代码: 调用 withLatestFrom 的 Observable 对象,起到主导数据产生给下游观察者...

  • RxSwift_操作符_withLatestFrom

    withLatestFrom 操作符将两个 Observables 中最新的元素通过一个函数组合起来,然后将这个组...

  • 2、Swift 基础运算

    赋值运算 算数运算 余数运算 一元加减法运算 混合赋值运算 比较运算 三元运算 空合运算符 范围运算 逻辑运算

  • Python 入门之常用运算符

    Python中的运算按种类可分为算数运算、比较运算、逻辑运算、赋值运算、成员运算、身份运算、位运算 1、常用运算符...

  • 黑猴子的家:Python 数据运算

    1、算术运算 2、比较运算 3、赋值运算 4、逻辑运算 5、成员运算 6、身份运算 7、位运算 code 8、运算...

  • 运算 & 运算符

    运算 & 运算符 算术运算 比较运算 比较运算的结果为bool值 赋值运算 逻辑运算 位运算 二进制的运算 身份检...

  • 2019-07-23

    R中的基本运算包括:算术运算、关系运算、逻辑运算、赋值运算以及其他运算。 算术运算:四则运算(+,-,*, /),...

  • JS 加、减、乘、除运算避免浮点数

    加法运算 减法运算 乘法运算 除法运算

网友评论

      本文标题:withLatestFrom 运算

      本文链接:https://www.haomeiwen.com/subject/okbxlttx.html