随着Swift在iOS开发中比重越来越大,接下来这个篇章我们一起来探索下RXSwift,领略下Swift以及RXSwift的魅力
函数响应式编程
一:函数式
函数式编程简称FP(Functional Programming)
,它是一种抽象程度很高的编程范式
函数式编程的一个特点就是:允许把函数本身作为参数传入另一个函数,同时还允许返回一个函数!
y = f(x) ---> x = f(x) ---> y = f(f(x)) ,
y = f(x)
这里的x
就转换成x = f(x)
正所谓光说不练假把式,那么来这样一个需求
1.获取 数组[1,2,3,4,5,6,7] 大于 3的数字
2.获取到数字之后 + 1
3.最后取出它们之中的偶数
let array = [1,2,3,4,5,6,7]
for num in array {
//1获取大于3的数字
if num > 3 {
let number = num + 1 //获取到数字之后 + 1
if number % 2 == 0 {
print(number) //取出它们之中的偶数
}
}
}
- 从上面的代码不难看出三个需求却嵌套了三层,实在是恶心~~~
- 随着嵌套层数增加,代码的可读性会直线下降
- 代码清晰度很差
- 代码维护以及代码构建成本太高
这样函数式编程就很好的解决了这些问题
array.filter { $0 > 3} //1获取大于3的数字
.filter { ($0+1) % 2 == 0 }//获取到数字之后 + 1,取出它们之中的偶数
.forEach{print($0+1)}
- 代码层次非常清晰
- 代码可读性高
- 代码复用性高
- 代码简洁,直接面向开发需求
二:响应式
- 对象对某一数据流变化做出响应的这种编码方式称为响应式。
就好像我们在某一时刻订阅了一个视频,在此之后这个视频的作者再发新的作品,我们也能收到作品的推送
在iOS开发中经常会响应一些事件button
、textField
、textView
、NSTimer
等等这些,都需要做响应监听,响应后都需要在对应的响应事件中去做处理,而原生开发中,触发对象与响应方法是分离的,如button的初始化和点击响应方法是分离的。功能代码与逻辑代码分析,导致很多比较恶心的感觉!
biu biu biu RxSwift闪亮✨登场
RxSwift简介
RxSwift 是 ReactiveX 家族的重要一员, ReactiveX 是 Reactive Extensions 的缩写,一般简写为 Rx。ReactiveX 官方给Rx的定义是:Rx是一个使用可观察数据流进行异步编程的编程接口。
RxSwfit有如下几个特性
- 复合-Rx就是复合的代名词
- 复用-因为它易复用
- 清晰-因为声明都是不可变更的
- 易用-因为它抽象了异步编程,使代码风格统一
- 稳定-因为Rx是完全通过单元测试的
- 框架跨平台性,RxSwift思想处处可用
一:button点击事件
func setupButton() {
//传统button添加ui事件 代码逻辑与事件逻辑分开 很恶心~~~~~
self.button.addTarget(self, action: #selector(buttonAction(_:)), for: .touchUpInside)
//Rx 功能逻辑和业务逻辑都在一起
self.button.rx.controlEvent(.touchUpInside)
.subscribe { _ in
print("点击事件")
}
.disposed(by: disposeBag)
}
二:textfiled文本响应
func setupTextFiled() {
//如果需要监听textFiled输入值的变换
//传统方式
// self.textFiled.addTarget(self, action: #selector(<#T##@objc method#>), for: .valueChanged)
//Rx
self.textFiled.rx.text.orEmpty.changed
.subscribe { text in
print("监听到了 - \(text)")
}
.disposed(by: disposeBag)
}
三:KVO
func setupKVO() {
//传统方式三步
//1.订阅
self.person.addObserver(self, forKeyPath: "name", options: .new ,context: nil)
}
//2.观察
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
print("响应")
print(change as Any)
}
//3.销毁
deinit {
self.removeObserver(self.person, forKeyPath: "name", context: nil)
}
传统的方式使用KVO
,我们从上面的代码可以感觉出来很恶心,我们看下RxSwift的实现方式
func setupKVO() {
//响应序列
self.person.rx.observeWeakly(String.self, "name")
.subscribe { value in
print(value as Any)
}
.disposed(by: disposeBag)
}
-
RxSwift
温柔的一句代码搞定
RxSwift
这个框架非常牛逼,把函数响应式玩到了高潮!接下来跟着我一起来玩一玩RxSwift吧