RXSwift基础序列及实现02

165 阅读3分钟

RX是通过序列来实现的序列

  • 有限序列(执行一次或者N次)
  • 无限序列(循环执行:timer 实现)
observable可观察序列 生命周期

591665281016_.pic.jpg

1. 与数字相关的序列
  • empty 0
  • just 1
  • of N
//只能订阅到 competed
var ob2 = Observable<Any>.empty().subscribe { Anystring in
            print(Anystring)
        }.disposed(by: disposebag)
//能订阅1个元素,just(elment )

        var ob4 = Observable<Any>.just(array).subscribe { array in

            print("value\(array)")

        }.disposed(by: disposebag)
       打印结果:
        valuenext([2, 4, 7, 9, 3, 6, 1])

        valuecompleted
//能订阅 N 个元素,of(elment,emlemt1,elment2)

        var ob4 = Observable<Any>.of(array,"234").subscribe { array in

            print("value\(array)")

        }.disposed(by: disposebag)

        //打印结果:

//        valuenext([2, 4, 7, 9, 3, 6, 1])

//        valuenext(234)

//        valuecompleted
2. 与集合相关的序列
  • from 从一个序列中如Array/Dictionary/Set,创建一个新序列
  • range 创建一个发出一系列整数的序列
var array = [2,4,7,9,3,6,1]

        var ob1 = Observable.from(array).filter({
            $0 > 4
        }).subscribe({
            value in
            print("value\(value)")

        }).disposed(by: disposebag)

        var ob3 = Observable.from(array).map({
            $0 * 2
        }).subscribe({
            value in
            print("value\(value)")
        }).disposed(by: disposebag)
//发出一系列整数的序列

        var ob5 = Observable<Int>.range(start: 4, count: 4)

            .subscribe { value in

                print("range序列\(value)")

            }.disposed(by: disposebag)
4. 计时器相关
func timerObserver()

    {

        //timer。timer延迟1s执行

//        var timer = Observable<Int>.timer(.seconds(1), scheduler: MainScheduler.instance)

//            .subscribe { value in

//                print("订阅到了\(value)")

//            } .disposed(by: disposebag)

        //timer2。timer循环订阅 多了<period>计时器

//        var timer2 = Observable<Int>.timer(.seconds(1),period: .seconds(1), scheduler: MainScheduler.instance)

//            .subscribe { value in

//                print("订阅到了\(value)")

//            } .disposed(by: disposebag)
    

        //timer3。timer换成interval 循环订阅 计时器不需要<period>

        var timer3 = Observable<Int>.interval(.seconds(1), scheduler: MainScheduler.instance)

            .subscribe { value in

                print("订阅到了\(value)")

            } .disposed(by: disposebag)

    }
5. 条件序列 generate
func generatorObserver(){

        var ob = Observable.generate(initialState: 10) {

            $0 < 15

        } iterate: {

            $0 + 3

        }.subscribe { value in

            print("订阅到了\(value)")

        }.disposed(by: disposebag)

        /*

         +7、+6、+5

         订阅到了next(10)

         +4
         订阅到了next(10)

         订阅到了next(14)
         +3

         订阅到了next(10)

         订阅到了next(13)

         +2

         订阅到了next(10)

         订阅到了next(12)

         订阅到了next(14)

         +1

         订阅到了next(10)

         订阅到了next(11)

         订阅到了next(12)

         订阅到了next(13)

         订阅到了next(14)

         */

    }
6. error 创建可观察序列,只发出错误信号
func errorObservable(){

        let error = NSError(domain: "出错IP", code: 880, userInfo: nil)

        //写法1  打印错误调onNext

//        Observable<Any>.error(error).subscribe { value  in

//            print("订阅error到了\(value)")

//        }

//        .disposed(by: disposebag)

        //写法2。打印错误走onError
        Observable<Any>.error(error).subscribe { value  in

            print("订阅error到了\(value)")

        }
        onError: { error in

            print("出错了\(error)")

        }

        .disposed(by: disposebag)
    }
7. deferred 每订建新序:为每个订阅者创建新序列
func defferedObservable(){
        var index = 1
        let defferedOb = Observable<String>.deferred {
            index += 1

            print("index ---\(index)")

            return Observable.create { observer in

                observer.onNext("1")

                observer.onNext("2")

                observer.onCompleted()

                return Disposables.create()

            }
        }
        defferedOb.subscribe {

            print("调用01:\($0)")

        }.disposed(by: disposebag)

        defferedOb.subscribe {

            print("调用02:\($0)")

        }.disposed(by: disposebag)
    }

    /*打印结果:

    index ---2

    调用01:next(1)

    调用01:next(2)

    调用01:completed

    index ---3

    调用02:next(1)

    调用02:next(2)

    调用02:completed*/
observeable 实现三步曲
  • 创建序列
  • 序列订阅
  • 发送信号
  1. 创建匿名序列,保存序列的subscribeHandler闭包(以供后来订阅回调)
  2. 序列订阅事件(监听事件),创建匿名订阅者,保存事件的闭包(eventHandler)
  3. 序列调用subscribeHandler传入匿名订阅者(observer)
  4. 订阅者调用事件闭包,序列监听到事件的响应即
  5. 订阅者调用方法 即为(信号发送)
  • 1、订阅者调用onNext方法,
  • 2、序列响应on方法
  • 3、on方法里面回调订阅的eventHandler里面的onNext方法,完成订阅方法的响应