RXswift 简单整理

2020-02-27  本文已影响0人  pengxiaochao

创建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
上一篇下一篇

猜你喜欢

热点阅读