美文网首页
elementAt运算

elementAt运算

作者: 幸运的小强本人 | 来源:发表于2016-03-13 12:13 被阅读40次

说明:
Returns a sequence emitting only item _n_ emitted by an observable

图片说明如下:


elementAt
extension ObservableType {
    public func elementAt(index: Int)->Observable<E> {
        return ElementAt(source: asObservable(), index: index, throwOnEmpty: true)
    }
}

class ElementAt<SourceType>: Producer<SourceType> {
    let _source: Observable<SourceType>
    let _throwOnEmpty: Bool
    let _index: Int

    init(source: Observable<SourceType>, index: Int, throwOnEmpty: Bool) {
        if index < 0 {
            rxFatalError("index can't be negative")
        }
        self._source = source
        self._index = index
        self._throwOnEmpty = throwOnEmpty
    }

    override func run<O: ObserverType where O.E == SourceType>(observer: O)->Disposable {
        let sink = ElementAtSink(parent: self, observer: observer)
        sink.disposable = _source.subscribeSafe(sink)
        return sink
    }
}

class ElementAtSink<SourceType, O: ObserverType where O.E == SourceType>: Sink<O>, ObserverType {
    typealias Parent = ElementAt<SourceType>

    let _parent: parent
    var _i: Int

    init(parent: Parent, observer: O) {
        _parent = parent
        _i = parent._index

        super.init(observer: observer)
    }

    func on(event: Event<SourceType>) {
        switch event {
        case .Next(_):
            if _i == 0 {
                forwardOn(event)
                forwardOn(.Completed)
                self.dispose()
            }

            do {
                try decrementChecked(&_i)
            }catch (let e) {
                forwardOn(.Error(e))
                dispose()
                return
            }
        case .Error(let e):
            forwardOn(.Error(e))
            self.dispose()
        case .Completed:
            if(_parent._throwOnEmpty) {
                forwardOn(.Error(RxError.ArgumentOutOfRange))
            }else {
                forwardOn(.Completed)
            }
            self.dispose()
        }
    }
}

相关文章

  • elementAt运算

    说明:Returns a sequence emitting only item _n_ emitted by a...

  • RxJava(四)--过滤操作符

    常用过滤操作符 filter、elementAt、distinct、skip、take、ignoreElement...

  • kotlin集合操作

    kotlin集合操作 集合取元素 位置取elementAt(int index) //标准位置取法,等价get()...

  • Filter

    过滤操作符(Filter) ignoreElements 过滤掉所有的.next事件 elementAt 只取el...

  • Kotlin 常用操作符

    下标操作类 contains —— 判断是否有指定元素 elementAt —— 返回对应的元素,越界会抛Inde...

  • Kotlin学习笔记(十三)函数操作符(元素操作符)

    1.contains 是否包含某个元素 2.elementAt 获取指定下标的元素 3.elementAtOrEl...

  • RxSwift- 常用的获取事件操作符

    在这一节,我们来看如何选择序列中的特定事件。 elementAt 首先,是选择序列中的第n个事件。还是基于上一节的...

  • 16.10常用的获取事件操作符

    在这一节,我们来看如何选择序列中的特定事件。 elementAt 首先,是选择序列中的第n个事件。还是基于上一节的...

  • 2、Swift 基础运算

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

  • Python 入门之常用运算符

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

网友评论

      本文标题:elementAt运算

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