美文网首页
RXswift 简单整理

RXswift 简单整理

作者: pengxiaochao | 来源:发表于2020-02-27 13:02 被阅读0次

    创建Observable 序列

    1. just() 方法

       //指定Observable携带参数为Int 类型(String,Array,[String:anyObject],float )均可    
       let obsrvalbel = Observable<Int>.just(5)
      
    2. of() 方法

       //指定Observable接受可变数量的参数(同一类型)  
       let observable = Observable.of("A", "B", "C")
      
    3. from() 方法

      //指定Observable接受可变数量的参数为数组  
       let observable = Observable.of(["A", "B", "C"])
      
    4. empty() 方法

       //该方法创建一个空内容的 Observable 序列。
       let observable = Observable<Int>.empty()
      
    5. never() 方法

       //该Observable创建一个永远不会发出event的序列
       let observable = Observable<Int>.never()
      
    6. error() 方法

       //该Observable创建一开始就会发出error事件的Observable 序列
       enum MyError: Error {
           case A
           case B
       }
                
       let observable = Observable<Int>.error(MyError.A)
      
    7. range() 方法

       //该方法通过指定起始和结束数值,创建一个以这个范围内所有值作为初始值的Observable序列。
       let observable = Observable.range(start: 1, count: 5)
      
    8. repeatElement() 方法

       //创建一个个可以无限发出给定元素的 Event的 Observable 序列(永不终止)。
       let observable = Observable.repeatElement(1)
      
    9. generate() 方法

       //创建一个只有当提供的所有的判断条件都为 true 的时候,才会给出动作的 Observable 序列
       let observable = Observable.generate(
           initialState: 0,
           condition: { $0 <= 10 },
           iterate: { $0 + 2 }
       )
      
       //和该序列结果一致
       let observable = Observable.of(0 , 2 ,4 ,6 ,8 ,10)
      
    10. create() 方法

      //创建一个以block为入参的Observable 
      //可在block内部发送onNext(),onError(),onCompleted()
      
      let observable = Observable<String>.create{observer in
          
          observer.onNext("hello,world")
          //对订阅者发出了.completed事件
          observer.onCompleted()
          //结尾一定要returen一个Disposable
          return Disposables.create()
      }
       
      //订阅测试
      observable.subscribe {
          print($0)
      }
      
    11. interval()方法

      //创建类似定时器的Observable 每隔固定时间发送定时事件,在指定线程
      let observable = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
      observable.subscribe { event in
          print(event)
      }
      
    12. timer() 方法

      //在指定线程创建类似定时器的ObserVable ,指定是否循环
      //5秒种后发出唯一的一个元素0
      let observable = Observable<Int>.timer(5, scheduler: MainScheduler.instance)
      observable.subscribe { event in
          print(event)
      }
      
      //延时5秒种后,每隔1秒钟发出一个元素
      let observable = Observable<Int>.timer(5, period: 1, scheduler: MainScheduler.instance)
      observable.subscribe { event in
          print(event)
      }
      

    Observable 的销毁工作

    1.主动销毁

    //1.创建Observable
    let observable = Observable.of('A','B','C')
    
    //2.监听Obverable 序列
    let _ = observable.subscribe{event in 
        print(event)
    }
    
    //3.手动调用dispose()方法销毁该observable
    observable.dispose()
    

    2.利用DisposeBag 垃圾袋实现自动回收管理
    如果不清楚 disposeBag 如何工作,参考我的文章https://www.jianshu.com/p/082cb80b28e0

    //1.创建DisposeBag对象
    let disposeBag = DisposeBag()
             
    //2.将第1个Observable 交给disposeBag 来管理
    let observable1 = Observable.of("A", "B", "C")
    observable1.subscribe { event in
        print(event)
    }.disposed(by: disposeBag)
     
    //3.将第2个Observable 交给disposeBag 来管理
    let observable2 = Observable.of(1, 2, 3)
    observable2.subscribe { event in
        print(event)
    }.disposed(by: disposeBag)
    //4.随着Viewcontroller 的生命周期deinit(),调用disposeBag 的dispose(),循环调用disposeBag中的数组对象,循环调用对象的dispose();
    

    AysncSubject

    特点:只发 最后一个 元素给观察者,有error只出error

    案例1.无error无complect ,监听事件无任何相应;
    案例2. 无error,有complect 发送只会complect 事件;
    案例3. 有error 只会发送error 事件;
    案例4. 有onNext 有complect 会收到onNext 和Complect 事件;
    

    PublishSubject

    特性:

    1. 是最普通的 Subject,它不需要初始值就能创建。
    2. PublishSubject 的订阅者从他们开始订阅的时间点起,可以收到订阅后 Subject 发出的新 Event,而不会收到他们在订阅前已发出的 Event
      '''
      let subject = PublishSubject<String>()
      subject.onNext("A") //不会收到
      subject.subscribe(onNext: { element in
      print("第1次订阅:", element)
      }, onCompleted: {
      print("第1次订阅:completed")
      }).disposed(by: bag)
      subject.onNext("B") //1订阅收到
        subject.subscribe(onNext: { element in
            print("第2次订阅:", element)
        }, onCompleted: {
            print("第2次订阅:completed")
        }).disposed(by: bag)
        
        subject.onNext("C")     //1、2订阅会收到
        subject.onNext("D")     //1、2订阅会收到
        subject.onCompleted()   //所有的订阅都会收到
        subject.onNext("F")     //不会收到
        
        //subject完成后,所有的订阅,包括完成后的订阅,都会收到.completed事件
        subject.subscribe(onNext: { element in
            print("第3次订阅:", element)
        }, onCompleted: {
            print("第3次订阅:completed")
        }).disposed(by: bag)
    
    — — — — — — — — — — — — — — — —
    //运行结果
    第1次订阅: B
    第1次订阅: C
    第2次订阅: C
    第1次订阅: D
    第2次订阅: D
    第1次订阅:completed
    第2次订阅:completed
    第3次订阅:completed
    

    BehaviourSubject

    特性:

    1. BehaviorSubject 需要通过一个默认初始值来创建;
    2. 当一个订阅者来订阅它的时候,这个订阅者会立即收到 BehaviorSubjects 上一个发出的event。之后就跟正常的情况一样,它也会接收到 BehaviorSubject 之后发出的新的 event;
    let subject = BehaviorSubject(value: "A")
        subject.subscribe(onNext: { element in
            print("第1次订阅:", element)
        }, onCompleted: {
            print("第1次订阅:completed")
        }).disposed(by: bag)
        subject.onNext("B")
        
        subject.subscribe(onNext: { element in
            print("第2次订阅:", element)
        }, onCompleted: {
            print("第2次订阅:completed")
        }).disposed(by: bag)
        
        subject.onNext("C")     //1、2订阅会收到
        subject.onNext("D")     //1、2订阅会收到
        subject.onCompleted()   //所有的订阅都会收到
        subject.onNext("F")     //不会收到
        
        //subject完成后,所有的订阅,包括完成后的订阅,都会收到.completed事件
        subject.subscribe(onNext: { element in
            print("第3次订阅:", element)
        }, onCompleted: {
            print("第3次订阅:completed")
        }).disposed(by: bag)
        
    — — — — — — — — — — — — — — — —
    //运行结果
    第1次订阅: A
    第1次订阅: B
    第2次订阅: B
    第1次订阅: C
    第2次订阅: C
    第1次订阅: D
    第2次订阅: D
    第1次订阅:completed
    第2次订阅:completed
    第3次订阅:completed
    

    replaySubject

    特性:

    1. ReplaySubject 在创建时候需要设置一个 bufferSize,表示它对于它发送过的 event 的缓存个数
    2. 比如一个 ReplaySubject 的 bufferSize 设置为 2,它发出了 3 个 .next 的 event,那么它会将后两个(最近的两个)event 给缓存起来。此时如果有一个 subscriber 订阅了这个 ReplaySubject,那么这个 subscriber 就会立即收到前面缓存的两个.next 的 event
    3. 如果一个 subscriber 订阅已经结束的 ReplaySubject,除了会收到缓存的 .next 的 event外,还会收到那个终结的 .error 或者 .complete 的event
    let subject = ReplaySubject<String>.create(bufferSize: 2)
        subject.subscribe(onNext: { element in
            print("第1次订阅:", element)
        }, onCompleted: {
            print("第1次订阅:completed")
        }).disposed(by: bag)
        subject.onNext("A")
        subject.onNext("B")
        
        subject.subscribe(onNext: { element in
            print("第2次订阅:", element)
        }, onCompleted: {
            print("第2次订阅:completed")
        }).disposed(by: bag)
        
        subject.onNext("C")
        subject.onCompleted()
        subject.onNext("D")     //不会收到
        
        //subject完成后,所有的订阅,包括完成后的订阅,都会收到.completed事件
        subject.subscribe(onNext: { element in
            print("第3次订阅:", element)
        }, onCompleted: {
            print("第3次订阅:completed")
        }).disposed(by: bag)
    
    — — — — — — — — — — — — — — — —
    //运行结果
    第1次订阅: A
    第1次订阅: B
    第2次订阅: A
    第2次订阅: B
    第1次订阅: C
    第2次订阅: C
    第1次订阅:completed
    第2次订阅:completed
    第3次订阅: B
    第3次订阅: C
    第3次订阅:completed
    

    BehaviorRelay

    特性:
    1.BehaviorRelay 作为Variable 的替代者出现
    2.BehaviorRelay 只有一个value 属性通过accept() 对值进行修改

    let subject = BehaviorRelay(value: "A")
            subject.asObservable().subscribe(onNext: { element in
                print("第1次订阅:", element)
            }, onCompleted: {
                print("第1次订阅:completed")
            }).disposed(by: bag)
        
        subject.accept("B")
        subject.asObservable().subscribe(onNext: { element in
            print("第2次订阅:", element)
        }, onCompleted: {
            print("第2次订阅:completed")
        }).disposed(by: bag)
        
        subject.accept("C")
    — — — — — — — — — — — — — — — —
    //运行结果
    第1次订阅: A
    第1次订阅: B
    第2次订阅: B
    第1次订阅: C
    第2次订阅: C

    相关文章

      网友评论

          本文标题:RXswift 简单整理

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