前言
Rx是ReactiveX的缩写,基于异步事件序列的响应式编程
其能提供优雅的数据绑定简化异步编程方法,能够时刻响应新的数据变化并能顺序地处理他们
为什么要学RxSwift
swif是静态语言,不像oc有个运行时可以动态地发消息,不能及时处理响应、消息等动态的方式,因此RxSwift来弥补缺陷,其有官方的框架叫Combine。
1、函数响应式编程(FRP)
函数响应式编程其实就是函数式编程和响应式编程的融合
- 函数式:可以将函数作为另一个函数的输入值和输出值
举个例子:
//给一个数组进行如下操作
// 首先获取 > 3的数字
// 获取的数字之后 + 1
// 所有数字中的偶数
let array = [1, 2, 3, 4, 5, 6, 7]
//普通编程思维
for num in array {
if num > 3 {
let number = num + 1
if (number % 2 == 0) {
print(number)
}
}
}
//函数式思维,使用高级函数
array.filter { $0 > 3 }
.filter { ($0+1) % 2 == 0 }
.forEach { print($0+1) }
- 响应式:基于数据流和变化来进行传递的一种声明式编程方式
// int a = 10
// int b = a + 10
// a += 10
// print(a, b)
//如果想要b随a进行变化,那么就要绑定a或者订阅a来监听b进行变化,这就是响应式的要实现的目的,比如KVO
2、RXSwift应用
这里举例几个常用的应用场景来感受下RXSwift的魅力
首先通过cocoapods引进RXSwift库,在podfile加入下面代码
pod 'RxSwift', '6.5.0'
pod 'RxCocoa', '6.5.0'
kvo
实现:点击按钮去改变某个变量,然后触发打印
观察者的方式:
//注册
self.person.addObserver(self, forKeyPath: "name", options: .new, context: nil)
//改变变量,可以在点击事件里改变name
person.name = "(person.name) 6"
//响应
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
print("响应")
print(change as Any)
}
// 释放
deinit {
self.removeObserver(self.person, forKeyPath: "name", context: nil)
}
RX方式实现:
//响应序列
self.person.rx.observeWeakly(String.self, "name")//注册
.subscribe { value in
print(value as Any)//响应
}
.disposed(by: disposeBag)//销毁
//改变变量,可以在点击事件里改变name
person.name = "(person.name) 6"
可以看到RX方式的简洁,同时将注册、响应、销毁放到一起,有利于理解和阅读
button响应
self.button.rx.controlEvent(.touchUpInside)
.subscribe { _ in
print("点击事件")
}
.disposed(by: disposeBag)
textfiled
self.textFiled.rx.text.orEmpty.changed
.subscribe { text in
print(text)
}
.disposed(by: disposeBag)
手势
let tap = UITapGestureRecognizer()
self.label.addGestureRecognizer(tap)
self.label.isUserInteractionEnabled = true
tap.rx.event.subscribe { tap in
print(tap.view!)
}
.disposed(by: disposeBag)
通知
NotificationCenter.default.rx.notification(UIResponder.keyboardWillShowNotification)
.subscribe { noti in
print(noti)
}
.disposed(by: disposeBag)
timer定时器
timer = Observable<Int>.interval(.seconds(1), scheduler: MainScheduler.instance)
timer.subscribe { num in
print(num)
}
.disposed(by: disposeBag)
通过这些demo,我们可以看到RXSwift给我们带来的新的编码方式,那么为什么万物皆可RX呐?下面一起通过源码的阅读来一起里了解RXSwift的核心原理吧
3、RXSwift核心原理
- 万物皆可以rx
我们可以先点击进rx里,看看这个rx是个什么,从源码可以看到rx是一个协议的关联类型,只要我在NSObject实现这个协议,那么继承于NSObject的类就都可以使用RX了
源码中NSObject扩展使用了ReactiveCompatible这个协议,因此万物皆可rx
小结
本文主要引出RxSwift的概念,列举几个比较实用的有关RxSwift的demo,体验下RxSwift的魅力,以及万物皆Rx的由来。