RxSwift快速接入使用指南
更详细请参考 https://beeth0ven.github.io/RxSwift-Chinese-Documentation/
Observable 可监听序列
Observer 观察者
一个点击事件:
1
2
3
4
5
6
7
tap.subscribe(onNext: { [weak self] in
self?.showAlert()
}, onError: { error in
print("发生错误: \(error.localizedDescription)")
}, onCompleted: {
print("任务完成")
})
观察者就是由后面的 onNext
,onError
,onCompleted
的这些闭包构建出来的。
可以改写成这样
1
2
3
4
5
6
7
8
9
10
11
12
13
let observer: AnyObserver<Data> = AnyObserver { (event) in
switch event {
case .next(let data):
print("next")
case .error(let error):
print("error")
case .completed:
print("completed")
default:
break
}
}
tap.subscribe(observer)
以及这种
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
usernameValid
.bind(to: usernameValidOutlet.rx.isHidden)
.disposed(by: disposeBag)
// 可以写成
let observer: AnyObserver<Bool> = AnyObserver { [weak self] (event) in
switch event {
case .next(let isHidden):
self?.usernameValidOutlet.isHidden = isHidden
default:
break
}
}
usernameValid
.bind(to: observer)
.disposed(by: disposeBag)
Schedulers 调度器
多线程操作,见如下GCD变换
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 后台取得数据,主线程处理结果
DispatchQueue.global(qos: .userInitiated).async {
let data = try? Data(contentsOf: url)
DispatchQueue.main.async {
self.data = data
}
}
// 可以使用rxswift如下
let rxData: Observable<Data> = ...
rxData
.subscribeOn(ConcurrentDispatchQueueScheduler(qos: .userInitiated))
.observeOn(MainScheduler.instance)
.subscribe(onNext: { [weak self] data in
self?.data = data
})
.disposed(by: disposeBag)
用 subscribeOn 来决定数据序列的构建函数在哪个 Scheduler 上运行。以上例子中,由于获取 Data
需要花很长的时间,所以用 subscribeOn 切换到 后台 Scheduler 来获取 Data
。这样可以避免主线程被阻塞。
用 observeOn 来决定在哪个 Scheduler 监听这个数据序列。以上例子中,通过使用 observeOn 方法切换到主线程来监听并且处理结果。
MainScheduler 代表主线程,SerialDispatchQueueScheduler 抽象了串行 DispatchQueue
,ConcurrentDispatchQueueScheduler 抽象了并行 DispatchQueue
,OperationQueueScheduler 抽象了 NSOperationQueue
。
RxRelay
RxRelay 是一个在 Subjects 之上很好的抽象层。它可以让我们发出元素,而不用担心 error 和 completed 这样的终止事件。
RxRelay 既是 可监听序列 也是 观察者。
他和 Subjects 相似,唯一的区别是不会接受 onError
或 onCompleted
这样的终止事件。
可以用他来封装函数调用,例如:
1
2
3
4
5
6
7
8
let disposeBag = DisposeBag()
let relay = BehaviorRelay(value: "🔴")
relay
.subscribe { print("Event:", $0) }
.disposed(by: disposeBag)
relay.accept("🐶")
本文由作者按照 CC BY 4.0 进行授权