RxSwift基本使用(一)

备注:本文参考自田腾飞博文 [RxSwift入坑解读-你所需要知道的各种概念] (http://www.codertian.com/2016/11/27/RxSwift-ru-keng-ji-read-document/),出于个人学习以及笔记需要特记录下RxSwift基本使用

概念

Observable : 可被观察的,事件源

Observer : 观察者,观察者需要订阅Observable,才能受到其发出的事件

DisposeBag : 相当于iOS中的ARC,会在适当的时候销毁观察者,自动去释放资源

如果需要手动销毁观察者直接调用dispose()方法,例: 
Observable.empty().subscribe { (str:Event) in 
print(“empty:”,str) 
}.dispose()

subscribe : 订阅者,用于订阅sequence发出的事件

基本使用

never

never就是创建一个sequence,但不发出任何事件信号

let bag = DisposeBag()
Observable.never().subscribe { (str :Event<String>) in
    print("never:",str) //无
}.addDisposableTo(bag)

备注:为了方便简洁,后续例子中创建bag变量的代码将省略

empty

empty创建一个空的sequence,但只能发出一个completed事件

Observable.empty().subscribe { (str :Event<String>) in
    print("empty:",str)
}.addDisposableTo(bag)

//empty: completed

just

just创建一个sequence,但只能发出一种特定的事件,能正常结束

Observable.just("just").subscribe { (str :Event<String>) in
    print("just:",str)
}.addDisposableTo(bag)

//just:next(just)
//just:completed

of

创建一个sequence能发出很多种事件信号

Observable.of("1","2","3").subscribe { (str) in
    print("of:",str)
}.addDisposableTo(bag)

    /**
    of: next(1)
    of: next(2)
    of: next(3)
    of: completed
    */

   //subscribe onNext 直接取值

    Observable.of("1","2","3").subscribe(onNext: { (str) in
        print("of2:",str)
    }).addDisposableTo(bag)

    /**
     of2: 1
     of2: 2
     of2: 3
     */

from

from从集合中创建sequence,例如数组,字典或者Set

    Observable.from([10,100,1000]).subscribe(onNext: { (num) in
        print("from:",num)
    }).addDisposableTo(bag)

    /**
     from: 10
     from: 100
     from: 1000
     **/

create

create 自定义可观察的sequence

    //create 自定义可观察的sequence
    let myObservable = Observable.create { (observer:AnyObserver<Any>) -> Disposable in
        observer.onNext("12")
        observer.onNext("21")
        observer.onNext("123")
        observer.onCompleted()
        return Disposables.create()
    }
    myObservable.subscribe { (e:Event<Any>) in
        print("myObservable:",e)
        }.addDisposableTo(bag)

    /**
     myObservable: next(12)
     myObservable: next(21)
     myObservable: next(123)
     myObservable: completed
     **/

range

range 创建一个sequence,会发出这个范围中所有事件

    Observable.range(start: 1, count: 5).subscribe(onNext: { (num) in
        print("range:",num)
    }).addDisposableTo(bag)
    /**
     range: 1
     range: 2
     range: 3
     range: 4
     range: 5
     **/

repeatElement

创建一个sequence,发出特定的事件n次

Observable.repeatElement("LouKit").take(3).subscribe { print($0)}.addDisposableTo(bag)

    //重复发出3次,如果没有take 就无限次
    /**
     next(LouKit)
     next(LouKit)
     next(LouKit)
     completed
     **/

generate

generate是创建一个可观察sequence,当初始化的条件为true的时候,他就会发出所对应的事件

    Observable.generate(initialState: 10, condition: {$0 < 15}, iterate: {$0 + 1}).subscribe(onNext: {print("generate",$0)}).addDisposableTo(bag)
    /**
     generate 10
     generate 11
     generate 12
     generate 13
     generate 14
     **/

deferred

deferred会为每一为订阅者observer创建一个新的可观察序列

    var index = 1
    let deferred = Observable<String>.deferred{

        print("index:",index)
        index += 1

        return Observable.create{ observer in
            observer.onNext("1")
            observer.onNext("2")
            observer.onCompleted()
            return Disposables.create()
        }
    }

    deferred.subscribe { print("调用1:",$0)}.addDisposableTo(bag)

    deferred.subscribe { print("调用2:",$0)}.addDisposableTo(bag)

    /**
     index: 1
     调用1: next(1)
     调用1: next(2)
     调用1: completed
     index: 2
     调用2: next(1)
     调用2: next(2)
     调用2: completed
     **/

do

主要用于在subscribe中onNext,onError,onCompleted前调用

    Observable.just("00").do(onNext: {print("doOnNext:",$0)},onError: {print("doOnError:",$0)},onCompleted: {print("doOnCompleted:")})
        .subscribe(onNext: { (str) in
            print("onNext:",str)
        }, onError: { (error) in
            print("onError")
        }, onCompleted: {
            print("onCompleted")
        }).addDisposableTo(bag)

    /**
     doOnNext: 00
     onNext: 00
     doOnCompleted:
     onCompleted
     **/

Subjects

Subjet是observable和Observer之间的桥梁,一个Subject既可以充当Obserable也可以充当Observer,即它可以发出事件,也可以监听事件

PublishSubject

采用PublishSubject订阅事件的时候,只能接收到订阅他之后发生的事件

    let publicSubject = PublishSubject<String>()
    publicSubject.onNext("A")
    publicSubject.onNext("B")
    publicSubject.subscribe(onNext: {print("publicSubject:",$0)}) .addDisposableTo(bag)
    publicSubject.onNext("C")
    publicSubject.onNext("D")

    /**
     publicSubject: C
     publicSubject: D
     **/

ReplaySubject

可以接收到订阅他之后以及之前发生的事件,对于要接受几个以前的事件取决于bufferSize设置的大小

    let replaySubject = ReplaySubject<String>.create(bufferSize: 2)
    replaySubject.onNext("A")
    replaySubject.onNext("B")
    replaySubject.onNext("C")
    replaySubject.onNext("D")
    replaySubject.subscribe(onNext: {print("replaySubject:",$0)}) .addDisposableTo(bag)
    replaySubject.onNext("E")
    replaySubject.onNext("F")
    replaySubject.onNext("G")
    /**
     replaySubject: C
     replaySubject: D
     replaySubject: E
     replaySubject: F
     replaySubject: G
     **/

    //接受全部的事件
    let replaySubject2 = ReplaySubject<String>.createUnbounded()
    replaySubject2.onNext("A")
    replaySubject2.onNext("B")
    replaySubject2.subscribe(onNext: {print("replaySubject2:",$0)}) .addDisposableTo(bag)
    replaySubject2.onNext("E")
    replaySubject2.onNext("F")

    /**
     replaySubject2: A
     replaySubject2: B
     replaySubject2: E
     replaySubject2: F
     **/

BehaviorSubject

采用BehaviorSubject订阅事件,会接收到订阅之前的最后一个事件以及订阅之后所有事件

    let behavior = BehaviorSubject(value: "behavior")
    behavior.onNext("A")
    behavior.onNext("B")
    behavior.subscribe(onNext: {print("behavior:",$0)}).addDisposableTo(bag)
    behavior.onNext("C")
    behavior.onNext("D")

    /**
     behavior: B
     behavior: C
     behavior: D
     **/

Variable

Variable是对BehaviorSubject一个包装;

Variable当成Obserable, 让订阅者进行订阅时, 需要asObserable转成Obserable;

Variable发出事件, 直接修改对象的value即可;

当事件结束时,Variable会自动发出completed事件

    let variable = Variable("variable")

    variable.value = "A"
    variable.value = "B"
    variable.asObservable().subscribe { (event:Event<String>) in
        print("variable:",event)
        }.addDisposableTo(bag)
    variable.value = "C"
    variable.value = "D"

    /**
     variable: next(B)
     variable: next(C)
     variable: next(D)
     variable: completed
     **/

联合操作

联合操作就是把多个Observable流合成单个Observable流

startWith

在发出事件消息之前,先发出某个特定的事件消息。

    Observable.of(1,2).startWith(3).subscribe(onNext: {print($0)}).addDisposableTo(bag)

    /**
     3
     1
     2
     **/

merge

将多个Observable流合成单个Observable流,然后任何一个Observable发出事件都能被接收到

    let sub1 = PublishSubject<String>()
    let sub2 = PublishSubject<String>()

    Observable.of(sub1,sub2).merge().subscribe(onNext: { print($0) }).addDisposableTo(bag)
    sub1.onNext("sub1-1")
    sub1.onNext("sub1-2")

    sub2.onNext("sub2-1")
    sub1.onNext("sub1-2")
    sub2.onNext("sub2-2")
    /**
     sub1-1
     sub1-2
     sub2-1
     sub1-2
     sub2-2
     **/

zip

将多个Observable流合成单个Observable流,只有当多个Observable流同时发出事件时,并且把多个Observable流的内容合并成一个元组,才会触发压缩流的事件。

    let zip1 = PublishSubject<String>()
    let zip2 = PublishSubject<String>()

    Observable.zip(zip1,zip2){ zip1,zip2 in
        "\(zip1) \(zip2)"
        }.subscribe(onNext: { print($0) })
        .addDisposableTo(bag)

    zip1.onNext("zip1-1")
    zip1.onNext("zip1-2")
    zip2.onNext("zip2-1")
    zip2.onNext("zip2-2")

    /**
     zip1-1 zip2-1
     zip1-2 zip2-2
     **/

注意:merge、zip都能将多个Observable流合成单个Observable流,但合并后前者任何一个Observable发出事件都能被接收到,后者必须是多个流同时发出事件时才被接收到

combineLatest

将多个Observable流合并起来 并拿到其各个流的最新值,即每个合并的signal至少都有过一次onNext,才会触发合并的流

    let ps1 = PublishSubject<String>()
    let ps2 = PublishSubject<String>()

    Observable.combineLatest(ps1, ps2) { element1, element2 in
        "\(element1) \(element2)"
        }
        .subscribe(onNext: { print($0) })
        .addDisposableTo(bag)

    ps1.onNext("ps1-01")
    ps1.onNext("ps1-02")
    ps2.onNext("ps2-01")

    /**
     ps1-02 ps2-01
     **/

switchLatest

用于对事件流进行转换,即一个Observable中的内容还是Observable。(个人理解)

    let bs1 = BehaviorSubject(value: "1")
    let bs2 = BehaviorSubject(value: "A")

    let variable = Variable(bs1)
    variable.asObservable().switchLatest().subscribe(onNext: {print($0)}).addDisposableTo(bag)
    bs1.onNext("2")
    variable.value = bs2
    bs1.onNext("3")
    bs2.onNext("B")
    /**
     1
     2
     A
     B
     **/
时间: 2024-10-06 13:27:37

RxSwift基本使用(一)的相关文章

RxSwift 实战操作【注册登录】

前言 看了前面的文章,相信很多同学还不知道RxSwift该怎么使用,这篇文件将带领大家一起写一个 注册登录(ps:本例子采用MVVM)的例子进行实战.本篇文章是基于RxSwift3.0写的,采用的是Carthage第三方管理工具导入的RxSwift3.0,关于Carthage的安装和使用,请参考Carthage的安装和使用. 最终效果 下载Demo点我 前提准备 首先请大家新建一个swift工程,然后把RxSwift引入到项目中,然后能够编译成功就行. 然后我们来分析下各个界面的需求: 注册界面

ReactiveCocoa / RxSwift 笔记一

原创:转载请注明出处 ReactiveCocoa / RxSwift Native app有很大一部分的时间是在等待事件发生,然后响应事件,比如 1.等待网络请求完成, 2.等待用户的操作, 3.等待某些状态值的改变等等, 等这些事件发生后,再做进一步处理 但是这些等待和响应,并没有一个统一的处理方式.Delegate, Notification, Block, KVO, 常常会不知道该用哪个最合适.有时需要chain或者compose某几个事件,就需要多个状态变量,而状态变量一多,复杂度也就上

RxSwift 系列(九)

前言 看完本系列前面几篇之后,估计大家也还是有点懵逼,本系列前八篇也都是参考RxSwift官方文档和一些概念做的解读.上几篇文章概念性的东西有点多,一时也是很难全部记住,大家脑子里面知道有这么个概念就行,用的时候,再来查阅一番,慢慢就掌握了. 本篇主要来深入了解一些RxSwift实战中用到的一些重要知识点,这里面有很多自己的理解,所以不免会有一些错误的地方,还请大家多多交流,如有发现错误的地方,欢迎评论. 概念 Rx系列的核心就是Observable Sequence这个相信大家心中已经有所了解

RxSwift 系列(八)

前言 本篇文章我们将学习RxSwift中的错误处理,包括: catchErrorJustReturn catchError retry retry(_:) catchErrorJustReturn 遇到error事件的时候,返回一个值,并且结束.更多详情 let disposeBag = DisposeBag() let sequenceFail = PublishSubject<String>() sequenceFail.catchErrorJustReturn("??"

RxSwift 系列(一)

为什么使用RxSwift? 我们编写的代码绝大多数都涉及对外部事件的响应.当用户点击操作时,我们需要编写一个@IBAction事件来响应.我们需要观察通知,以检测键盘何时改变位置.当网络请求响应数据时,我们必须提供闭包来执行.我们使用KVO来检测变量的变化.所有这些不同的系统使我们的代码增加了不必要地复杂.如果有一个一致的系统来处理我们的所有的调用/响应代码,难道不是更好吗?Rx就是这样一个系统. RxSwift是用于大多数主要语言和平台的响应扩展(即Rx)的正式实现. 概念 每一个Observ

Swift &#160;之 RxSwift(1)

RxSwift 官方文档结构 Introduction: Subjects Transforming Observables Filtering Observables Combining Observables Error Handing Operators Observable Utility Operators Conditional and Boolean Operators Mathematical and Aggregate Operators Connectable Observa

RxSwift 系列(三)

RxSwift 系列(三) -- Combination Operators 前言 本篇文章将要学习如何将多个Observables组合成一个Observable.Combination Operators在RxSwift中的实现有五种: startWith merge zip combineLatest switchLatest startWith 在Observable释放元素之前,发射指定的元素序列.更多详情上面这句话是什么意思呢?翻译成大白话就是在发送一个东西之前,我先发送一个我指定的东

RxSwift 系列(二)

前言 Subject是一个代理,它既是Observer,也是Observable.因为它是一个Observer,它可以订阅一个或多个Observable;因为它是一个Observable,它又可以被其他的Observer订阅.它可以传递/转发作为Observer收到的值,也可以主动发射值. Subject在RxSwift中的实现有四种: PublishSubject ReplaySubject BehaviorSubject Variable PublishSubject 代理我们先以Publi

RxSwift 系列(六)

前言 本篇文章将要学习RxSwift中数学和集合操作符,在RxSwift中包括了: toArray reduce concat toArray 将一个Observable序列转化为一个数组,并转换为一个新的Observable序列发射,然后结束. let disposeBag = DisposeBag() Observable.of(1,2,3,4,5).toArray().subscribe(onNext: {print($0)}).disposed(by: disposeBag) 运行结果:

RxSwift 系列(七)

前言 本篇文章将要学习RxSwift中连接操作符.Connectable Observable在订阅时不发射事件消息,而是仅当调用它们的connect()方法时才发射消息,这样就可以等待所有我们想要的订阅者都已经订阅了以后,再开始发出事件消息,这样能保证我们想要的所有订阅者都能接收到事件消息.其实也就是等大家都就位以后,开始发出消息. 在开始学习Connectable Observable之前,让我们来看一个non-connectable operator: let intervar = Obs