1. 函数式编程(Functional Programming,简称FP)
主要思想是把函数看做是“第一等公民”,函数与其他数据类型一样,可以赋值给其他变量,也可以作为函数的参数,以及函数的返回值,类似于下面这样
func sum(_ a: Int, _ b: Int) -> Int { a + b } func sub(_ a: Int, _ b: Int) -> Int { a - b } print(sum(sub(20, 10), sub(40, 20)))//10 + 20 = 30
2. 响应式编程(Rective Programming,简称RP)
主要是为了简化异步编程,提供一种更优雅的数据绑定,一般与函数式结合在一起,所以也会叫做函数响应式编程(Functional Rective Programming,简称FRP)
有人这样理解函数响应式编程,比如c = a + b,变量c为变量a与变量b的和,当执行完这条语句之后,当我们再次改变变量a或者变量b的值的时候,c不会变化,而函数响应式编程就是为了实现当变量a或变量b变化的时候,变量c也跟着变化的。
3. 响应式编程框架
ReactiveCocoa(RAC):有OC和Swift两个版本
ReactiveX:有很多语言的版本,比如RxJava,RxJS,RxPHP,RXSwift,RxKotlin等,其中RxSwift(RectiveX for Swift),为RectiveX的Swift版本;
RxSwift:RectiveX标准API的Swift实现,不包括iOS相关的任何内容
RxCocoa:基于RxSwift,给iOS的UI控件扩展了很多Rx特性
4. RxSwift常用事件回调
iOS中的回调方式有非常多的种类,UIKit
主要进行的事件处理Target-Action
、delegate
、Block
、NotifcationCenter
、KVO
监听。而原生开发中,触发对象与响应方法是分离的,如UIButton
的初始化和点击响应方法是分离的。RxSwift恰好能以统一的形式来解决跨类调用的问题,也包装了UIKit
事件处理、NotifcationCenter
、KVO
等常见的场景,让代码整合的更加统一。
01. 按钮点击
let button = UIButton(type: .custom) button.frame = CGRect(x: 100, y: 100, width: 100, height: 100) button.backgroundColor = .red view.addSubview(button) button.rx.tap.subscribe(onNext: { print("button click") }).disposed(by: disposeBag) let button = UIButton(type: .custom) button.frame = CGRect(x: 100, y: 100, width: 100, height: 100) button.backgroundColor = .red view.addSubview(button) button.rx.tap.subscribe(onNext: { print("button click") }).disposed(by: disposeBag)
02. 手势
let tap = UITapGestureRecognizer() view.addGestureRecognizer(tap) tap.rx.event.subscribe { print("gesture click ", $0) }.disposed(by: disposeBag) let tap = UITapGestureRecognizer() view.addGestureRecognizer(tap) tap.rx.event.subscribe { print("gesture click ", $0) }.disposed(by: disposeBag)
03. 文本输入监听
let textField = UITextField(frame: CGRect(x: 200, y: 100, width: 101, height: 100)) textField.borderStyle = .line view.addSubview(textField) textField.rx.text.orEmpty.changed.throttle(.milliseconds(100), scheduler: MainScheduler.instance).subscribe { (text) in print(text) }.disposed(by: disposeBag) let textField = UITextField(frame: CGRect(x: 200, y: 100, width: 101, height: 100)) textField.borderStyle = .line view.addSubview(textField) textField.rx.text.orEmpty.changed.throttle(.milliseconds(100), scheduler: MainScheduler.instance).subscribe { (text) in print(text) }.disposed(by: disposeBag)
04. 代理监听
view.addSubview(scrollView) scrollView.rx.didScroll.subscribe {[weak scrollView] _ in print("开始滚动了 - ", scrollView?.contentOffset.y ?? 0) }.disposed(by: disposeBag) scrollView.rx.contentOffset.subscribe { print("contentOffset - ", $0.y) }.disposed(by: disposeBag) view.addSubview(scrollView) scrollView.rx.didScroll.subscribe {[weak scrollView] _ in print("开始滚动了 - ", scrollView?.contentOffset.y ?? 0) }.disposed(by: disposeBag) scrollView.rx.contentOffset.subscribe { print("contentOffset - ", $0.y) }.disposed(by: disposeBag)
05. KVO
scrollView.rx.observeWeakly(CGPoint.self, "contentOffset").subscribe { (value) in print("kvo - contentOffset - ", value) }.disposed(by: disposeBag) scrollView.rx.observeWeakly(CGPoint.self, "contentOffset").subscribe { (value) in print("kvo - contentOffset - ", value) }.disposed(by: disposeBag)
06. 通知
NotificationCenter.default.rx.notification(UIApplication.willEnterForegroundNotification).subscribe { (_) in print("进入前台") }.disposed(by: disposeBag) NotificationCenter.default.rx.notification(UIApplication.didEnterBackgroundNotification).subscribe { (_) in print("进入后台") }.disposed(by: disposeBag)
07. 网络回调
URLSession.shared.rx.response(request: URLRequest(url: URL(string: "https://www.baidu.com")!)).subscribe { (resp, data) in print("响应结果code ->", resp.statusCode, "data.count ->", data.count) }.disposed(by: disposeBag)
08. 定时器
Observable<Int>.interval(.seconds(1), scheduler: MainScheduler.instance).subscribe(onNext: { (res) in print(res) }).disposed(by: disposeBag) Observable<Int>.interval(.seconds(1), scheduler: MainScheduler.instance).subscribe(onNext: { (res) in print(res) }).disposed(by: disposeBag)
还有更多控件的使用监听回调,如UITextView
、UITableView
、UISegmentedControl
、UISearchBar
等UI控件均可监听,具体可查看RxSwift、RxCocoa源码。
1. 函数式编程(Functional Programming,简称FP)
主要思想是把函数看做是“第一等公民”,函数与其他数据类型一样,可以赋值给其他变量,也可以作为函数的参数,以及函数的返回值,类似于下面这样
func sum(_ a: Int, _ b: Int) -> Int { a + b } func sub(_ a: Int, _ b: Int) -> Int { a - b } print(sum(sub(20, 10), sub(40, 20)))//10 + 20 = 30 func sum(_ a: Int, _ b: Int) -> Int { a + b } func sub(_ a: Int, _ b: Int) -> Int { a - b } print(sum(sub(20, 10), sub(40, 20)))//10 + 20 = 30
2. 响应式编程(Rective Programming,简称RP)
主要是为了简化异步编程,提供一种更优雅的数据绑定,一般与函数式结合在一起,所以也会叫做函数响应式编程(Functional Rective Programming,简称FRP)
有人这样理解函数响应式编程,比如c = a + b,变量c为变量a与变量b的和,当执行完这条语句之后,当我们再次改变变量a或者变量b的值的时候,c不会变化,而函数响应式编程就是为了实现当变量a或变量b变化的时候,变量c也跟着变化的。
3. 响应式编程框架
ReactiveCocoa(RAC):有OC和Swift两个版本
ReactiveX:有很多语言的版本,比如RxJava,RxJS,RxPHP,RXSwift,RxKotlin等,其中RxSwift(RectiveX for Swift),为RectiveX的Swift版本;
RxSwift:RectiveX标准API的Swift实现,不包括iOS相关的任何内容
RxCocoa:基于RxSwift,给iOS的UI控件扩展了很多Rx特性
4. RxSwift常用事件回调
iOS中的回调方式有非常多的种类,UIKit
主要进行的事件处理Target-Action
、delegate
、Block
、NotifcationCenter
、KVO
监听。而原生开发中,触发对象与响应方法是分离的,如UIButton
的初始化和点击响应方法是分离的。RxSwift恰好能以统一的形式来解决跨类调用的问题,也包装了UIKit
事件处理、NotifcationCenter
、KVO
等常见的场景,让代码整合的更加统一。
01. 按钮点击
let button = UIButton(type: .custom) button.frame = CGRect(x: 100, y: 100, width: 100, height: 100) button.backgroundColor = .red view.addSubview(button) button.rx.tap.subscribe(onNext: { print("button click") }).disposed(by: disposeBag)
02. 手势
let tap = UITapGestureRecognizer() view.addGestureRecognizer(tap) tap.rx.event.subscribe { print("gesture click ", $0) }.disposed(by: disposeBag) let tap = UITapGestureRecognizer() view.addGestureRecognizer(tap) tap.rx.event.subscribe { print("gesture click ", $0) }.disposed(by: disposeBag)
03. 文本输入监听
let textField = UITextField(frame: CGRect(x: 200, y: 100, width: 101, height: 100)) textField.borderStyle = .line view.addSubview(textField) textField.rx.text.orEmpty.changed.throttle(.milliseconds(100), scheduler: MainScheduler.instance).subscribe { (text) in print(text) }.disposed(by: disposeBag) let textField = UITextField(frame: CGRect(x: 200, y: 100, width: 101, height: 100)) textField.borderStyle = .line view.addSubview(textField) textField.rx.text.orEmpty.changed.throttle(.milliseconds(100), scheduler: MainScheduler.instance).subscribe { (text) in print(text) }.disposed(by: disposeBag)
04. 代理监听
view.addSubview(scrollView) scrollView.rx.didScroll.subscribe {[weak scrollView] _ in print("开始滚动了 - ", scrollView?.contentOffset.y ?? 0) }.disposed(by: disposeBag) scrollView.rx.contentOffset.subscribe { print("contentOffset - ", $0.y) }.disposed(by: disposeBag)
05. KVO
scrollView.rx.observeWeakly(CGPoint.self, "contentOffset").subscribe { (value) in print("kvo - contentOffset - ", value) }.disposed(by: disposeBag)
06. 通知
NotificationCenter.default.rx.notification(UIApplication.willEnterForegroundNotification).subscribe { (_) in print("进入前台") }.disposed(by: disposeBag) NotificationCenter.default.rx.notification(UIApplication.didEnterBackgroundNotification).subscribe { (_) in print("进入后台") }.disposed(by: disposeBag)
07. 网络回调
URLSession.shared.rx.response(request: URLRequest(url: URL(string: "https://www.baidu.com")!)).subscribe { (resp, data) in print("响应结果code ->", resp.statusCode, "data.count ->", data.count) }.disposed(by: disposeBag) URLSession.shared.rx.response(request: URLRequest(url: URL(string: "https://www.baidu.com")!)).subscribe { (resp, data) in print("响应结果code ->", resp.statusCode, "data.count ->", data.count) }.disposed(by: disposeBag)
08. 定时器
Observable<Int>.interval(.seconds(1), scheduler: MainScheduler.instance).subscribe(onNext: { (res) in print(res) }).disposed(by: disposeBag)
还有更多控件的使用监听回调,如UITextView
、UITableView
、UISegmentedControl
、UISearchBar
等UI控件均可监听,具体可查看RxSwift、RxCocoa源码。