RxSwift <1> —— 初探
废话不多说,直接上干货!!!
函数响应式编程
函数式
函数式编程简称FP(Functional Programming),函数式编程是一种抽象程度很高的编程范式,将计算机运算看做数学中的函数计算,实际上纯粹的函数式语言编程编写的函数式没有变量,任何一个函数只要输入确定,则输出就确定,这样的模式我们称之为没有副作用。允许使用变量的程序设计语言,由于内部变量状态不确定,同样的输入,可能得到不同的输出结果,称之为函数副作用。
函数式编程特点是允许吧函数本身作为一个参数传递给另一个函数,同时韩允许返回另一个函数。例如:
函数表达式: y = f(x) ---> x = f(x) ---> y = f(f(x))
举个栗子🌰
对于数组[1,2,3,4,5,6,7,8,9]首先获取》2的数字,在获取数字之后+1,在输出偶数:
let array = [1,2,3,4,5,6,7,8,9]
for num in array{
if num > 2{
let number = num + 1
if (number % 2 == 0) {
print(number)
}
}
}
以上是常规写法.如果这样实现呢:
let array = [1,2,3,4,5,6,7,8,9]
array.filter{$0 > 2}
.filter{($0 + 1) % 2 == 1}
.forEach{print($0)}
响应式
对象某一数据流发生变化作出的相应这种编码方式称之为响应式。
iOS开发中经常用需要相应一些事件,button,tap,textfield,textView,KVO等等。接下来就介绍大杀器-------RXSwift。
RXSwift
RxSwift 是 ReactiveX 家族的重要一员, ReactiveX 是 Reactive Extensions 的缩写,一般简写为 Rx。ReactiveX 官方给Rx的定义是:Rx是一个使用可观察数据流进行异步编程的编程接口。
2257417-8a63113cba6f9aec.png
ReactiveX 不仅仅是一个编程接口,它是一种编程思想的突破,它影响了许多其它的程序库和框架以及编程语言。它拓展了观察者模式,使你能够自由组合多个异步事件,而不需要去关心线程,同步,线程安全,并发数据以及I/O阻塞。
RxSwift 是 Rx 为 Swift 语言开发的一门函数响应式编程语言, 它可以代替iOS系统的 Target Action / 代理 / 闭包 / 通知 / KVO,同时还提供网络、数据绑定、UI事件处理、UI的展示和更新、多线程……
鉴于Swift日渐增长的影响力,ios开发者不可避免的要学习和使用Swift这门语言进行编程开发。而RxSwift对使用Swift的帮助有如下几点:
Swift为值类型,在传值与方法回调上有影响,RxSwift一定程度上弥补Swift的灵活性
- RxSwift使得代码复用性较强,减少代码量
- RxSwift因为声明都是不可变更,增加代码可读性
- RxSwift使得更易于理解业务代码,抽象异步编程,统一代码风格
- RxSwift使得代码更易于编写集成单元测试,增加代码稳定性
举几个常用的栗子:
1. button 点击响应
self.button.rx.tap
.subscribe(onNext:{
print("button tap action")
}).disposed(by: disposeBag)
2. textField 响应
self.textField.rx.text.orEmpty
.skip(1)
.distinctUntilChanged()
.subscribe(onNext:{text in
print(text)
})
.disposed(by: disposeBag)
3. scrollView响应
self.scrollView.rx.contentOffset.subscribe(onNext:{[weak self] (content) in
guard let strongSelf = self else {return}
strongSelf.view.backgroundColor = UIColor.init(red: content.y/255.0*0.6, green: content.y/255.0*0.3, blue: content.y/255.0*0.6, alpha: 1)
}).disposed(by: disposeBag)
4. KVO
person.rx.observeWeakly(String.self, "name").subscribe(onNext: { (change) in
print(change ?? "helloword")
}).disposed(by: disposeBag)
5. 通知
NotificationCenter.default.rx
.notification(UIResponder.keyboardWillShowNotification)
.subscribe { (event) in
print(event)
}.disposed(by: disposeBag)
6.手势
let tap = UITapGestureRecognizer()
self.label.addGestureRecognizer(tap)
self.label.isUserInteractionEnabled = true
tap.rx.event.subscribe { (event) in
print("点了label")
}.disposed(by: disposeBag)
7.定时器
timer = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
timer.subscribe(onNext: { (num) in
print("hello word \(num)")
}).disposed(by: disposeBag)
RXSwift 实现的timer免去了传统的runloop影响,不需要关心销毁问题,不需要关心Scrollview滑动问题。