1. 什么是响应式编程?比较著名的两个框架是哪两个?
- 响应式编程
(Reactive Programming,简称 RP)
- 也是一种
编程范式
,于 1997 年提出,可以简化异步编程
,提供更优雅的数据绑定
- 一般与函数式融合在一起,所以也会叫做:
函数响应式编程(Functional Reactive Programming,简称 FRP)
2. RxSwift 的基本介绍
// 本次 RxSwift 版本环境
RxSwift (5.0.0)
RxCocoa (5.0.0)
3. RxSwift 的三个核心概念是什么?分别做什么?
-
Observable:
负责发送事件(Event)
-
Observer:
负责订阅 Observable
,监听 Observable
发送的事件(Event)
-
Event:
负责 Observable
和 Observer
的沟通,有三种状态 next、error、completed
4. 最基础用法:创建事件发送者、创建事件订阅者、发送事件
// ①创建observable,在内部发布事件
let observable = Observable<Int>.create {
(observer) -> Disposable in
// ②发送事件
observer.onNext(11)
observer.onNext(22)
observer.onCompleted()
return Disposables.create()
}
// ③subscible() 内部会创建Observer 并监听 observable
observable.subscribe(onNext: { (value) in
print(value);
}, onError: { (error) in
print(error)
}, onCompleted: {
print("onCompleted")
})
5. 几种快速创建 Observable 并且发送事件的方式
// ①通过数组创建,数组每个元素触发一次 onNext
let observable1 = Observable.from([1,2,3])
// ②发送一次事件
let observable2 = Observable.just(1)
// ③通过可变参数创建
let observable3 = Observable.of(1,2,3)
6. 创建带延迟和定时器的 Observable,并将结果设置给 Label 控件
let observable = Observable<Int>.timer(.seconds(2),
period: .seconds(1),
scheduler: MainScheduler.instance)
// countLabel.rx.text 就是 Binder 也就是 Observer
observable.map { "数值是:\($0)" }.bind(to: countLabel.rx.text)
7. Disposable 对象用于控制订阅者的生命周期,有常见的三种方式释放订阅,哪三种?
8. 创建自己初始化的 Observer 实例的两种方式?(AnyObserver、Binder)
// ①通过 AnyObserver 创建自定义 Observer
let observer = AnyObserver<Int>.init { event in
switch event {
case .next(let data):
print(data)
case .error(let error):
print(error)
case .completed:
print("completed")
}
}
Observable.just(1).subscribe(observer).dispose()
// ①通过 Binder 创建自定义 Observer
let binder = Binder<Int>.init(countLabel) { (label, value) in
label.text = "数值:\(value)"
}
Observable.just(1).subscribe(binder).dispose()
9. 让 UILabel 每隔一秒切换隐藏展示
,体会 Binder 的用处
// ①通过 Binder 创建自定义 Observer
let binder = Binder<Bool>.init(countLabel) {
(label, value) in
label.isHidden = value
}
// ②创建定时发送的 Observable
let observable = Observable<Int>.timer(.seconds(3), period: .seconds(1), scheduler: MainScheduler.instance)
// ③Observer 订阅 Observable
observable.map( {$0 % 2 == 0} ).bind(to: binder).disposed(by: bag)
其实 Binder 就是能让我们拿到操作对象(UILabel)的 Observer
10. 传统的状态监听方式有哪些(五种)?有什么弊端?(重要)
- 在开发中经常要对各种状态进行监听,传统的常见监听方案有:
- KVO
- Target-Action
- Notification
- Delegate
- Block Callback
- 弊端:
传统方案经常会出现错综复杂的依赖关系、耦合性比较高,还需要编写重复的非业务代码
11. 监听按钮点击
button.rx.tap.subscribe { (evet) in
print("按钮被点击了",evet)
}.disposed(by: bag)
12. RxSwift 中的 TableView
let data = Observable.just([
Person(name: "Jack", age: 10),
Person(name: "Rose", age: 20)
])
data.bind(to: tableView.rx.items(cellIdentifier: "cell")){
row, person, cell in
cell.textLabel?.text = person.name
cell.detailTextLabel?.text = "\(person.age)"
}.disposed(by: bag)
tableView.rx.modelSelected(Person.self)
.subscribe(onNext: { print("点击了", $0.name)})
.disposed(by: bag)
13. Notification 监听