RxSwift 简介
函数式响应式编程(FRP)
-
函数式编程是种编程方式,它将电脑运算视为函数的计算。函数编程语言最重要的基础是λ演算(lambda calculus),而且λ演算的函数可以接受函数当作输入(参数)和输出(返回值)。
和指令式编程相比,函数式编程强调函数的计算比指令的执行重要。
和过程化编程相比,函数式编程里函数的计算可随时调用。 - 响应式编程是一种面向数据流和变化传播的编程范式。这意味着可以在编程语言中很方便地表达静态或动态的数据流,而相关的计算模型会自动将变化的值通过数据流进行传播。
为什么要用RxSwift
- 复合 - Rx 就是和复合的代名词
- 复用 - 复⽤性⽐较强 - 代码量降低
- 清晰 - 因为声明都是不可变更,代码函数式编程可读性强
- 易用 - 理解容易,还抽象的了异步编程,统一代码⻛格
- 稳定 - 因为 Rx 是完全通过单元测试的
- 装逼 - 代码的逼格很明显⽐原生高太多了
可观察序列(Observable)
可观察序列(Observable) ,序列中主要有三种类型的数据(信号), Next
,Error
,Complete
.如下图:
Observable
- Next 是 Observable 用来交付正常数据(信号).
- Error 可以交付错误信号,就是去通知 Observer,哪里出了问题
- Complete 可以通知 Observer 已经完成,没有可以提交的数据了
- 示例代码
let url = URL.init(string: "http://www.baidu.com")!
let urlRequest = URLRequest.init(url: url)
URLSession.shared.rx.response(request: urlRequest)
.subscribe(onNext: { (response,data) in
print("接收响应数据\(data)")
}, onError: { (error) in
print("错误\(error)")
}, onCompleted: {
print("完成")
})
Observable 核⼼流程
主要分为三步:
- Create: 创建可观察的序列
- Subscribe: 添加订阅
- on: 发送信号,Next,Error,Complete.
Observable 核⼼流程
- 示例代码
// 1. 创建一个序列
let ob = Observable<Any>.create{ (ob) -> Disposable in
// 3. 发送信号
ob.onNext("zhongxiaoyue")
ob.onCompleted()
return Disposables.create()
}
// 2.给这个序列 添加一个订阅者
let _ = ob.subscribe(onNext: { (text) in
print("接收到信号:\(text)")
}, onError: { (error) in
print("发生错误error: \(error)")
}, onCompleted: {
print("完成")
}) {
print("销毁")
}
RxSwift 应用示例
- 网络请求
func setupNextwork() {
let url = URL(string: "https://www.baidu.com")
URLSession.shared.rx.response(request: URLRequest(url: url!))
.subscribe(onNext: { (response,data) in
print(response)
}).disposed(by: disposeBag)
}
- timer定时器
func setupTimer() {
timer = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
timer.subscribe(onNext: { (num) in
print(num)
})
.disposed(by: disposeBag)
}
- 通知
func setupNotification(){
NotificationCenter.default.rx.notification(UIResponder.keyboardWillShowNotification)
.subscribe(onNext: { (noti) in
print(noti)
})
.disposed(by: disposeBag)
}
- 手势
func setupGestureRecognizer(){
let tap = UITapGestureRecognizer()
self.label.addGestureRecognizer(tap)
self.label.isUserInteractionEnabled = true
tap.rx.event
.subscribe(onNext: { (tap) in
print(tap.view)
})
.disposed(by: disposeBag)
}
- scrollView
func setupScrollerView() {
scrollView.rx.contentOffset
.subscribe(onNext: { [weak self](content) in
self?.view.backgroundColor = UIColor.init(red: content.y/255*0.8, green: content.y/255*0.6, blue: content.y/255*0.3, alpha: 1)
})
.disposed(by: disposeBag)
}
- textfiled
func setupTextFiled() {
self.textFiled.rx.text.orEmpty
.subscribe(onNext: { (text) in
print(text)
})
.disposed(by: disposeBag)
}
- button响应
func setupButton() {
self.button.rx.tap
.subscribe(onNext: { () in
print("点击了")
})
.disposed(by: disposeBag)
}
- KVO
func setupKVO() {
self.person.rx.observeWeakly(String.self, "name")
.subscribe(onNext: { (value) in
print(value as Any)
})
.disposed(by: disposeBag)
}