RxSwift(一)

empty,它会发送一个 Completed 事件,创建一个不发射任何数据但是正常终止的 Observable

// empty
        let emptySeq: Observable<Int> = empty()
        let subscription = emptySeq.subscribe { event in
            print(event)
        }
        // 输出Completed

never 不会发送任何事件,创建一个不发射数据也不终止的 Observable

// never 
        let neverSeq: Observable<String> = never()
        let subscription = neverSeq.subscribe { event in
            print(event)
        }
        // 什么都没用打印

just,会先发送Next(Value),然后发送 Completed,创建一个发射指定值的 Observable。

Paste_Image.png
// just
        let justSeq = just("RxSwift")
        let subscription = justSeq.subscribe { event in
            print(event)
        }
        // 打印
        // Next(RxSwift)
        // Completed

sequenceOf 把一系列元素转换为事件

// sequenceOf
        let sequenceElements = sequenceOf(1, 2, 3, 4)
        let subscription = sequenceElements.subscribe { event in
            print(event)
        }

from 通过 asObservable,把其他数据类型转换为 Observable

Paste_Image.png
// asObservable, 把序列转换成Observable
        let sequenceFromArray = [1, 2, 3, 4].asObservable()
        let subscription = sequenceFromArray.subscribe { event in
            print(event)
        }
        // 输出
        // Next(1)
        // Next(2)
        // Next(3)
        // Next(4)
        // Completed

create,通过它重新创建一个Observable,通过.on发射Next和Completed事件

Paste_Image.png
// create创建序列,通过.on添加事件
        let myCreate = { (element: Int) -> Observable<Int> in
            return create { observer in
                observer.on(.Next(element))
                observer.on(.Completed)
                return NopDisposable.instance
            }
        }
        let subscription = myCreate(1).subscribe { event in
            print(event)
        }
        // 输出
        // Next(1)
        // Completed

failWith

// failWith,只会发送Error事件
        let error = NSError(domain: "error", code: 1001, userInfo: nil)
        let errorSeq: Observable<Int> = failWith(error)
        let subscription = errorSeq.subscribe { event in
            print(event)
        }
        // 输出
        // Error(Error Domain=error Code=1001 "(null)")

deferred 直到有订阅者订阅才创建 Observable,并为每一个订阅者创建一个新的 Observable,在某些情况下,要等到最后一分钟才能获取到最新的数据,就需要这样做

Paste_Image.png
// deferred 会等到有订阅者,订阅它才创建Observable
        let deferredSeq: Observable<Int> = deferred {
            print("create")
            return create { observer in
                observer.on(.Next(0))
                observer.on(.Next(1))
                observer.on(.Next(2))
                return NopDisposable.instance
            }
        }
        deferredSeq.subscribe { event in
            print(event)
        }
        /*
        create
        Next(0)
        Next(1)
        Next(2)
        */

Subjects

PublishSubject

// PublishSubject,会发送从订阅者,订阅之后的事件
        let subject = PublishSubject<String>()
        subject.subscribe { event in
            print("1->\(event)")
        }
        subject.on(.Next("a"))
        subject.on(.Next("b"))
        subject.subscribe { event in
            print("2->\(event)")
        }
        subject.on(.Next("c"))
        // 输出
        /*
        1->Next(a)
        1->Next(b)
        1->Next(c)
        2->Next(c)
        */
Paste_Image.png

BehaviorSubject

// BehaviorSubject 它开始发射原始 Observable 最近发射的数据,然后继续发送其他来自Observable的数据
        let subject = BehaviorSubject(value: "z")
        subject.subscribe { event in
            print("1->\(event)")
        }
        subject.on(.Next("a"))
        subject.on(.Next("b"))
        subject.subscribe { event in
            print("2->\(event)")
        }
        subject.on(.Next("c"))
        subject.on(.Completed)
        // 输出
        1->Next(a)
        1->Next(b)
        1->Next(c)
        2->Next(c)
Paste_Image.png

ReplaySubject

// ReplaySubject,当有订阅者,订阅了的时候他能重发事件,bufferSize指定重发的次数,补发1次
        let subject = ReplaySubject<String>.create(bufferSize: 1)
        subject.subscribe { event in
            print("1->\(event)")
        }
        subject.on(.Next("a"))
        subject.on(.Next("b"))
        subject.subscribe { event in
            print("2->\(event)")
        }
        subject.on(.Next("c"))
        // 输出
        /*
        1->Next(a)
        1->Next(b)
        2->Next(b)
        1->Next(c)
        2->Next(c)
        */
Paste_Image.png

Transform

map

Paste_Image.png
// map,通过对Observable发射映射的函数对每一项做转换
        let originalSeq = sequenceOf(1, 2, 3)
        originalSeq.map { $0 * 2 }.subscribe { print($0) }
        /*
        输出
        Next(2)
        Next(4)
        Next(6)
        Completed
        */

flatMap

// flatMap将一个发射数据的Observable变换为多个Observables,然后将它们发射的数据合并后放进一个单独的Observable
        let seqInt = sequenceOf(1, 2, 3)
        let seqString = sequenceOf("a", "b", "c")
        seqInt.flatMap { int in seqString }.subscribe { print($0) }
        /*
        Next(a)
        Next(b)
        Next(c)
        Next(a)
        Next(b)
        Next(c)
        Next(a)
        Next(b)
        Next(c)
        Completed
        */

scan

Paste_Image.png
// scan连续的对序列中的元素应用某一个元素。然后把结果作为下一次的输入
        let seqToSum = sequenceOf(1, 2, 3, 4)
        seqToSum.scan(0) { (sum, ele) -> Int in
            sum + ele
            }.subscribe { print($0) }
        /*
        输入
        Next(1)
        Next(3)
        Next(6)
        */

Filtering

Paste_Image.png
// filter,过滤不符合要求的元素
        let seq = sequenceOf(0, 1, 2, 3, 4, 5, 6, 7, 8)
        seq.filter { $0 % 2 == 0 }
            .subscribe { print($0) }
        /*
        输出
        Next(0)
        Next(2)
        Next(4)
        Next(6)
        Next(8)
        Completed
        */

distinct

// distinct,去掉相邻的相同元素
        let seq = sequenceOf(1, 2, 2, 2, 3, 1, 1, 4, 1, 4)
        seq.distinctUntilChanged().subscribe { print($0) }
        /*
        输出
        Next(1)
        Next(2)
        Next(3)
        Next(1)
        Next(4)
        Next(1)
        Next(4)
        Completed
        */

take

// take保留前几项的数据
        let subscription = sequenceOf(1, 2, 3, 4 , 5).take(3).subscribe { print($0) }
        /*
        Next(1)
        Next(2)
        Next(3)
        Completed
        */

Combining(组合操作)

startWith

// startWith在数据序列前出入指定数据
        let subscription = sequenceOf(2, 3, 4, 5).startWith(1).subscribe { print($0) }
        /*
        Next(1)
        Next(2)
        Next(3)
        Next(4)
        Next(5)
        Completed
        */

combineLatest

Paste_Image.png
// combineLatest,当两个Observables中任意一个发送了数据,使用一个函数把两个Observable中最近的数据进行结合
        let stringOb = PublishSubject<String>()
        let intOb = PublishSubject<Int>()
        combineLatest(stringOb, intOb) {
            "\($0) \($1)"
            }.subscribe { print($0) }
        stringOb.on(.Next("A"))
        intOb.on(.Next(1))
        stringOb.on(.Next("B"))
        stringOb.on(.Next("C"))
        /*
        Next(A 1)
        Next(B 1)
        Next(C 1)
        */

zip

Paste_Image.png
// zip它会等到Observable中的数据一一对应结合时,再发送数据
        let stringOb = PublishSubject<String>()
        let intOb = PublishSubject<Int>()
        zip(stringOb, intOb) { "\($0) \($1)" }.subscribe { print($0) }
        stringOb.on(.Next("A"))
        stringOb.on(.Next("B"))
        intOb.on(.Next(1))
        intOb.on(.Next(2))

merge

Paste_Image.png
        // merge,合并对个Observables的发射物
        let subject1 = PublishSubject<Int>()
        let subject2 = PublishSubject<Int>()
        sequenceOf(subject1, subject2).merge().subscribe { print($0) }
        subject1.onNext(1)
        subject2.onNext(2)
        subject1.onNext(3)
        /*
        Next(1)
        Next(2)
        Next(3)
        */

switchLatest

// switchLatest,将一个Observable<Observable<T>>转为为这样的Observable,它逐个发射数据的Observable
        let var1 = Variable(0)
        let var3 = Variable(var1)
        let d = var3.switchLatest().subscribe { print($0) }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容