创建Observable 序列
-
just() 方法
//指定Observable携带参数为Int 类型(String,Array,[String:anyObject],float )均可 let obsrvalbel = Observable<Int>.just(5)
-
of() 方法
//指定Observable接受可变数量的参数(同一类型) let observable = Observable.of("A", "B", "C")
-
from() 方法
//指定Observable接受可变数量的参数为数组 let observable = Observable.of(["A", "B", "C"])
-
empty() 方法
//该方法创建一个空内容的 Observable 序列。 let observable = Observable<Int>.empty()
-
never() 方法
//该Observable创建一个永远不会发出event的序列 let observable = Observable<Int>.never()
-
error() 方法
//该Observable创建一开始就会发出error事件的Observable 序列 enum MyError: Error { case A case B } let observable = Observable<Int>.error(MyError.A)
-
range() 方法
//该方法通过指定起始和结束数值,创建一个以这个范围内所有值作为初始值的Observable序列。 let observable = Observable.range(start: 1, count: 5)
-
repeatElement() 方法
//创建一个个可以无限发出给定元素的 Event的 Observable 序列(永不终止)。 let observable = Observable.repeatElement(1)
-
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)
-
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) }
-
interval()方法
//创建类似定时器的Observable 每隔固定时间发送定时事件,在指定线程 let observable = Observable<Int>.interval(1, scheduler: MainScheduler.instance) observable.subscribe { event in print(event) }
-
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
特性:
- 是最普通的 Subject,它不需要初始值就能创建。
- 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
特性:
- BehaviorSubject 需要通过一个默认初始值来创建;
- 当一个订阅者来订阅它的时候,这个订阅者会立即收到 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
特性:
- ReplaySubject 在创建时候需要设置一个 bufferSize,表示它对于它发送过的 event 的缓存个数
- 比如一个 ReplaySubject 的 bufferSize 设置为 2,它发出了 3 个 .next 的 event,那么它会将后两个(最近的两个)event 给缓存起来。此时如果有一个 subscriber 订阅了这个 ReplaySubject,那么这个 subscriber 就会立即收到前面缓存的两个.next 的 event
- 如果一个 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
网友评论