文章

RxSwift快速接入使用指南

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 进行授权