十四、其他一些實(shí)用的操作符(Observable Utility Operators)
1误辑,delay
(1)基本介紹
- 該操作符會(huì)將
Observable
的所有元素都先拖延一段設(shè)定好的時(shí)間沧踏,然后才將它們發(fā)送出來。
(2)使用樣例
import UIKit
import RxSwift
import RxCocoa
class ViewController: UIViewController {
let disposeBag = DisposeBag()
override func viewDidLoad() {
Observable.of(1, 2, 1)
.delay(3, scheduler: MainScheduler.instance) //元素延遲3秒才發(fā)出
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
}
}
運(yùn)行結(jié)果如下:
2巾钉,delaySubscription
(1)基本介紹
- 使用該操作符可以進(jìn)行延時(shí)訂閱翘狱。即經(jīng)過所設(shè)定的時(shí)間后,才對(duì)
Observable
進(jìn)行訂閱操作砰苍。
(2)使用樣例
import UIKit
import RxSwift
import RxCocoa
class ViewController: UIViewController {
let disposeBag = DisposeBag()
override func viewDidLoad() {
Observable.of(1, 2, 1)
.delaySubscription(3, scheduler: MainScheduler.instance) //延遲3秒才開始訂閱
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
}
}
運(yùn)行結(jié)果如下:
3潦匈,materialize
(1)基本介紹
- 該操作符可以將序列產(chǎn)生的事件,轉(zhuǎn)換成元素赚导。
- 通常一個(gè)有限的
Observable
將產(chǎn)生零個(gè)或者多個(gè)onNext
事件茬缩,最后產(chǎn)生一個(gè)onCompleted
或者onError
事件。而materialize
操作符會(huì)將Observable
產(chǎn)生的這些事件全部轉(zhuǎn)換成元素吼旧,然后發(fā)送出來凰锡。
(2)使用樣例
import UIKit
import RxSwift
import RxCocoa
class ViewController: UIViewController {
let disposeBag = DisposeBag()
override func viewDidLoad() {
Observable.of(1, 2, 1)
.materialize()
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
}
}
運(yùn)行結(jié)果如下,可以和上面的樣例比較下:
4圈暗,dematerialize
(1)基本介紹
- 該操作符的作用和
materialize
正好相反掂为,它可以將materialize
轉(zhuǎn)換后的元素還原。
(2)使用樣例
import UIKit
import RxSwift
import RxCocoa
class ViewController: UIViewController {
let disposeBag = DisposeBag()
override func viewDidLoad() {
Observable.of(1, 2, 1)
.materialize()
.dematerialize()
.subscribe(onNext: { print($0) })
.disposed(by: disposeBag)
}
}
運(yùn)行結(jié)果如下:
5员串,timeout
(1)基本介紹
使用該操作符可以設(shè)置一個(gè)超時(shí)時(shí)間勇哗。如果源 Observable
在規(guī)定時(shí)間內(nèi)沒有發(fā)任何出元素,就產(chǎn)生一個(gè)超時(shí)的 error
事件寸齐。
(2)使用樣例
import UIKit
import RxSwift
import RxCocoa
class ViewController: UIViewController {
let disposeBag = DisposeBag()
override func viewDidLoad() {
//定義好每個(gè)事件里的值以及發(fā)送的時(shí)間
let times = [
[ "value": 1, "time": 0 ],
[ "value": 2, "time": 0.5 ],
[ "value": 3, "time": 1.5 ],
[ "value": 4, "time": 4 ],
[ "value": 5, "time": 5 ]
]
//生成對(duì)應(yīng)的 Observable 序列并訂閱
Observable.from(times)
.flatMap { item in
return Observable.of(Int(item["value"]!))
.delaySubscription(Double(item["time"]!),
scheduler: MainScheduler.instance)
}
.timeout(2, scheduler: MainScheduler.instance) //超過兩秒沒發(fā)出元素智绸,則產(chǎn)生error事件
.subscribe(onNext: { element in
print(element)
}, onError: { error in
print(error)
})
.disposed(by: disposeBag)
}
}
運(yùn)行結(jié)果如下:
6,using
(1)基本介紹
- 使用
using
操作符創(chuàng)建Observable
時(shí)访忿,同時(shí)會(huì)創(chuàng)建一個(gè)可被清除的資源瞧栗,一旦Observable
終止了,那么這個(gè)資源就會(huì)被清除掉了海铆。
(2)使用樣例
import UIKit
import RxSwift
import RxCocoa
class ViewController: UIViewController {
override func viewDidLoad() {
//一個(gè)無限序列(每隔0.1秒創(chuàng)建一個(gè)序列數(shù) )
let infiniteInterval$ = Observable<Int>
.interval(0.1, scheduler: MainScheduler.instance)
.do(
onNext: { print("infinite$: \($0)") },
onSubscribe: { print("開始訂閱 infinite$")},
onDispose: { print("銷毀 infinite$")}
)
//一個(gè)有限序列(每隔0.5秒創(chuàng)建一個(gè)序列數(shù)迹恐,共創(chuàng)建三個(gè) )
let limited$ = Observable<Int>
.interval(0.5, scheduler: MainScheduler.instance)
.take(2)
.do(
onNext: { print("limited$: \($0)") },
onSubscribe: { print("開始訂閱 limited$")},
onDispose: { print("銷毀 limited$")}
)
//使用using操作符創(chuàng)建序列
let o: Observable<Int> = Observable.using({ () -> AnyDisposable in
return AnyDisposable(infiniteInterval$.subscribe())
}, observableFactory: { _ in return limited$ }
)
o.subscribe()
}
}
class AnyDisposable: Disposable {
let _dispose: () -> Void
init(_ disposable: Disposable) {
_dispose = disposable.dispose
}
func dispose() {
_dispose()
}
}
運(yùn)行結(jié)果如下: