RxSwift
刚开始看Rx系列,个人感觉和RAC(相对于思想)很相似。用法其实也差不多,可能语法使用上会有些差别。
of from
Of 和From的语法炸一看,简直就是一样的嘛,看了一会儿,才发现of接受的是elements...,而from接受的参数是数组,实质上2者没有区别。
Deferred
public static func deferred(_ observableFactory: @escaping () throws -> Observable<E>)
-> Observable<E> {
return Deferred(observableFactory: observableFactory)
}
关于deferred,一开始看到,并不是很明白,这个加不加好像没什么区别吧。之后看到一篇文章,里面的例子非常好地解释了deferred的作用
example("deferred") {
var value = "may"
let observable = Observable.just("wow" + value)
let observableDeferred = Observable<String>.deferred {
return Observable.just("wow" + value)
}
value = " Deferred"
observable.subscribe(onNext: { print($0) })
observableDeferred.subscribe(onNext: { print($0) })
// print
// --- deferred example ---
// wowmay
// wow Deferred
}
可以看到输出结果的对比。其实deferred的作用也很简单。然后看实现,相当于是一种延时加载的方法。还没有深究。(待研究,内部实现应该没看着这么简单)
ReplaySubject
这个subject有一个有趣的创建方法
public static func create(bufferSize: Int) -> ReplaySubject<Element> {
if bufferSize == 1 {
return ReplayOne()
}
else {
return ReplayMany(bufferSize: bufferSize)
}
}
bufferSize是缓存,即记录下订阅者订阅之前的n个events,然后再订阅之后先发送这n个events,然后再发送接下来的events。
BehaviorSubject
这个subject和ReplaySubject类似,只是只会记录住最后一个event然后发送。
Variable
这个类是将BehaviorSubject封装了一层。拥有着BehaviorSubject的特性,同时永远不会发送error event。并且在适当的时候会自动complete。
Zip
zip可以结合最多8个Observable,整合到一个Observable中去。
将每个Observable看作一个队列,只有每个队列一致的位置都传输出值的时候才会去传输最终的整合后的结果。
Reduce
.reduce(1, accumulator: +)会通过1个初始值,然后按照之后的closure进行处理得到最后的值。
Concat
合并n组的数据,但是只有在发送observable结束之后才会发送下一个observable,其间下一组observable发送了什么看特性是否需要保留。
example("concat") {
let disposeBag = DisposeBag()
let subject1 = BehaviorSubject(value: "🍎")
let subject2 = ReplaySubject<String>.create(bufferSize: 2) // BehaviorSubject(value: "🐶")
let variable = Variable(subject1 as Observable)
variable.asObservable()
.concat()
.subscribe { print($0) }
.addDisposableTo(disposeBag)
subject1.onNext("🍐")
subject1.onNext("🍊")
variable.value = subject2
subject2.onNext("I would be ignored")
subject2.onNext("🐱")
subject1.onCompleted()
subject2.onNext("🐭")
}
比如使用subject2使用BehaviorSubject,由于BehaviorSubject只会记录最后一个结果的特性,"I would be ignored"不会打印。
而使用了ReplaySubject,就可以打印出来。
调试时专用
RxSwift非常友善地提供了一些在便于debug的函数。debug,resourceCount
Observable<T>.bebug() // 可以输出具体位置
RxSwift.resourceCount // 实际上就是retainCount,可以用来查看整个项目中的内存分配问题