swift基础知识

RxSwift 总结

2020-10-14  本文已影响0人  指尖_跳舞

基本概念:

Observable<T> (可观察序列):异步地产生一系列Event(事件)即:event(element:T)
Observer(订阅者):订阅Observable,收到Observable<T>发出的Event
Event:一个枚举源码如下


public enum Event<Element> {
/// Next element is produced.
case next(Element)
/// Sequence terminated with an error.
case error(Swift.Error)
 /// Sequence completed successfully.
 case completed
 }

创建Observable序列

分为普通序列和特征序列

一、普通序列

1、just()
Observable<Int>.just(5) 发出一个5
2、of()
Observable.of("a","b","c") 可变参数同一类型
3、from()
Observable.from(["a","b","c"]) 需要一个数组
4、empty()

5、never()
永远不会发出
6、error()
Observable<Int>.error(myError.errorA)
需要一个Error类型参数
7、range()
Observable.range(start: 1, count: 5)
范围值
8、repeatElement()
Observable.repeatElement(1)
无限发出给定元素的event (永不终止)
9、generate()

Observable.generate(
    initialState: 0, 
    condition: { $0 <= 10 }, 
    iterate: { $0 + 2 }
)// 0 2 4 6 8 10

条件判断
10、create()
block创建

let observable10 = Observable<String>.create { ob in
            ob.onNext("test")
            ob.onError(myError.errorA)
            ob.onCompleted()
//            因为一个订阅行为会有一个Disposables类型的返回值,所以在结尾一定要return一个Disposables
            return Disposables.create {}
        }

11、deferred()
创建一个工厂

        var isOdd = true
        
        let factory: Observable<Int> = Observable.deferred {
            isOdd = !isOdd
            
            if isOdd {
                return Observable.of(1,3,5,7)
            }
            else {
                return Observable.of(2,4,6,8)
            }
        }
        
//        第一次订阅
        factory.subscribe{ event in
                print("\(isOdd)",event)
        }//false 2...
        
//        第二次订阅
        factory.subscribe{ event in
            print("\(isOdd)",event)
        }//true,1 ...

12、interval()
创建一个 Observable 每隔一段时间,发出一个索引数

Observable<Int>.interval(1, scheduler: MainScheduler.instance)
        ob.subscribe { event in
                print(event)
        }.disposed(by: disposeBag)

13、timer()

        //timer()  创建一个经过设定的一段时间后,产生唯一的元素
        let ob2 = Observable<Int>.timer(5, scheduler: MainScheduler.instance)
        
        ob2.subscribe{  event in
                print("ob2--->",event)
        }
        
//        第二种 就是经过设定一段时间,每隔一段时间产生一个元素
//        第一个参数就是等待5秒,第二个参数为每个1秒产生一个元素
        
        let ob3 = Observable<Int>.timer(5, period: 1, scheduler: MainScheduler.instance)

二、特征序列

1、Single()

2、Completable()

3、Maybe()

4、Driver()---->(用于UI事件)

5、Signal()

6、ControlEvent
专门用于描述 UI 控件所产生的事件,具有以下特征:

创建Observer 观察者

创建观察者最直接的方法就是在 Observable 的 subscribe 方法后面描述,事件发生时,需要如何做出响应。而观察者就是由后面的 onNext,onError,onCompleted的这些闭包构建出来的。
还可以以下方式:
1、AnyObserver
AnyObserver 可以用来描叙任意一种观察者。

2、Binder

既是观察者也是监听者 Subject

1、AsyncSubject
AsyncSubject 将在源 Observable 产生完成事件后,发出最后一个元素(仅仅只有最后一个元素),如果源 Observable 没有发出任何元素,只有一个完成事件。那 AsyncSubject 也只有一个完成事件。
它会对随后的观察者发出最终元素。如果源 Observable 因为产生了一个 error 事件而中止, AsyncSubject 就不会发出任何元素,而是将这个 error 事件发送出来。
2、PublishSubject
PublishSubject 将对观察者发送订阅后产生的元素,而在订阅前发出的元素将不会发送给观察者。
3、ReplaySubject
ReplaySubject 将对观察者发送全部的元素,无论观察者是何时进行订阅的。
4、BehaviorSubject
当观察者对 BehaviorSubject 进行订阅时,它会将源 Observable 中最新的元素发送出来(如果不存在最新的元素,就发出默认元素)。然后将随后产生的元素发送出来。
如果源 Observable 因为产生了一个 error 事件而中止, BehaviorSubject 就不会发出任何元素,而是将这个 error 事件发送出来。
5、ControlProperty
ControlProperty 专门用于描述 UI 控件属性的,它具有以下特征:

RxRelay

RxRelay 既是 可监听序列 也是 观察者 使用accept代替onNext。
他和 Subjects 相似,唯一的区别是不会接受 onErroronCompleted 这样的终止事件。
1、PublishRelay
PublishRelay 就是 PublishSubject 去掉终止事件 onErroronCompleted
2、BehaviorRelay
BehaviorRelay 就是 BehaviorSubject 去掉终止事件 onErroronCompleted

Operator -操作符

操作符可以帮助大家创建新的序列,或者变化组合原有的序列,从而生成一个新的序列。

let disposeBag = DisposeBag()

let subject1 = BehaviorSubject(value: "🍎")
let subject2 = BehaviorSubject(value: "🐶")

let variable = Variable(subject1)

variable.asObservable()
        .concatMap { $0 }
        .subscribe { print($0) }
        .disposed(by: disposeBag)

subject1.onNext("🍐")
subject1.onNext("🍊")

variable.value = subject2

subject2.onNext("I would be ignored")
subject2.onNext("🐱")

subject1.onCompleted()

subject2.onNext("🐭")

输出结果

next(🍎)
next(🍐)
next(🍊)
next(🐱)
next(🐭)

上一篇 下一篇

猜你喜欢

热点阅读