文章

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("任务完成")
})

观察者就是由后面的 onNextonErroronCompleted的这些闭包构建出来的。

可以改写成这样

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 相似,唯一的区别是不会接受 onErroronCompleted 这样的终止事件。

可以用他来封装函数调用,例如:

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