简单的Observable Sequence实现:
_ = Observable<String>.create({ (observerOfString) -> Disposable in
print("Observable created")
observerOfString.on(.Next("😉"))
observerOfString.on(.Completed)
return NopDisposable.instance
}).subscribe({ (event) in
print(event)
})
subscribe(: )
会返回Disposable
实例, 一般会把它处理掉, 由此介绍了DisposeBag
这个类型, 感觉是相当于@autoReleasePool
, 一条信号在完结的时候, 总要回收的嘛:
let disposeBag = DisposeBag()
Observable<Int>.empty()
.subscribe { event in
print(event)
}
.addDisposableTo(disposeBag)
创建Observable Sequence的各种API
创建有且只有单个元素的Sequence
Observable.just("SingleElement")
创建固定数量多个元素的Sequence
Observable.of("🐶", "🐱", "🐭", "🐹")
创建一个范围的元素组成的Sequence
Observable.range(start: 1, count: 10)
创建重复元素组成的Sequence
Observable.repeatElement("🔴")
.take(3)
这里的调用take代表repeat3次.
自定义某个range构成的Sequence, 自己加其中过滤条件
Observable.generate(
initialState: 0,
condition: { $0 < 3 },
iterate: { $0 + 1 }
)
用<SequenceType>来创建Observable Sequence.
["🐶", "🐱", "🐭", "🐹"].toObservable()
Empty Sequence只发送一个complete事件
Observable<Int>.empty()
Error Sequence只发送一个Error事件.
Observable<Int>.error(Error.Test)
Never Sequence 永远不会发送事件
Observable<String>.never()
手动创建Sequence构成方法
let myJust = { (element: String) -> Observable<String> in
return Observable.create { observer in
observer.on(.Next(element))
observer.on(.Completed)
return NopDisposable.instance
}
}
myJust("🔴")
.subscribe { print($0) }
创建生产Sequence的工厂方法
let deferredSequence = Observable<String>.deferred {
return Observable.create { observer in
print("Emitting...")
observer.onNext("🐶")
observer.onNext("🐱")
observer.onNext("🐵")
return NopDisposable.instance
}
}
每一个subscribe了defferedSequence
的监听者监听的都是单独的信号, 意思就是每监听一次调一次工厂方法创建新的信号.
监听的类型和不同写法
Subscribe除了Subscrilbe(:)
一锅端之外也可以是Subscribe单个种类的Event
.subscribeNext { element in
print(element)
}
同样还有subscribeError(_:)
和subscribeCompleted(_:)
, 或者用混合模式: subscribe(onNext:onError:onCompleted:onDisposed:)
someObservable.subscribe(
onNext: { print("Element:", $0) },
onError: { print("Error:", $0) },
onCompleted: { print("Completed") },
onDisposed: { print("Disposed") }
)
顺便做做"doOn"
Observable.of("🍎", "🍐", "🍊", "🍋")
.doOn { print("Intercepted:", $0) }
.subscribeNext { print($0) }
.addDisposableTo(disposeBag)
doOn
可以在整个Sequence的任何位置调用, 可以提取当前位置传递进来的Event类型, 做一些操作 ! 同时也有细分出来的doOnNext(_:)
, doOnError(_:)
, doOnCompleted(_:)
方法.
Referece:
https://github.com/ReactiveX/RxSwift/tree/master/Rx.playground
https://github.com/ReactiveX/RxSwift/tree/master/Documentation
网友评论