初识RxSwift初识RxSwift

简介: 初识RxSwift

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-ActiondelegateBlockNotifcationCenterKVO监听。而原生开发中,触发对象与响应方法是分离的,如UIButton的初始化和点击响应方法是分离的。RxSwift恰好能以统一的形式来解决跨类调用的问题,也包装了UIKit事件处理、NotifcationCenterKVO等常见的场景,让代码整合的更加统一。


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)

还有更多控件的使用监听回调,如UITextViewUITableViewUISegmentedControlUISearchBar等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-ActiondelegateBlockNotifcationCenterKVO监听。而原生开发中,触发对象与响应方法是分离的,如UIButton的初始化和点击响应方法是分离的。RxSwift恰好能以统一的形式来解决跨类调用的问题,也包装了UIKit事件处理、NotifcationCenterKVO等常见的场景,让代码整合的更加统一。


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)

还有更多控件的使用监听回调,如UITextViewUITableViewUISegmentedControlUISearchBar等UI控件均可监听,具体可查看RxSwift、RxCocoa源码。

相关文章
|
存储 iOS开发
iOS 开发,如何进行应用的本地化(Localization)?
iOS 开发,如何进行应用的本地化(Localization)?
403 2
|
3月前
Vite使用svg-企业级开发(支持本地svg和网络svg渲染)
本教程介绍如何在Vite项目中集成SVG图标插件。首先安装`vite-plugin-svg-icons`,配置插件指向SVG图标目录,并注册全局组件。接着创建SVG图标组件,支持内部图标与外部图片展示。通过简单配置,即可在页面中灵活使用各类SVG图标,提升开发效率。
198 0
|
8月前
|
开发工具 Android开发 iOS开发
flutter 环境配置
flutter 环境配置
1479 63
|
7月前
|
人工智能 分布式计算 大数据
MCP、MaxFrame与大数据技术全景解析
本文介绍了 MCP 协议、MaxFrame 分布式计算框架以及大数据基础设施建设的相关内容。MCP(Model Context Protocol)是一种开源协议,旨在解决 AI 大模型与外部数据源及工具的集成问题,被比喻为大模型的“USB 接口”,通过统一交互方式降低开发复杂度。其核心架构包括 Client、Server、Tool 和 Schema 四个关键概念,并在百炼平台中得到实践应用。MaxFrame 是基于 Python 的高性能分布式计算引擎,支持多模态数据处理与 AI 集成,结合 MaxCompute 提供端到端的数据处理能力。
|
Web App开发 前端开发 Android开发
iOS 唤起 APP: Universal Link(通用链接)(下)
iOS 唤起 APP: Universal Link(通用链接)(下)
1807 0
iOS 唤起 APP: Universal Link(通用链接)(下)
|
项目管理 Python
如何在Mac上安装多个Python环境
在你的Mac上使用多个Python环境可以对项目管理很有帮助,特别是在同时处理不同Python版本或不同的包需求时。在这篇文章中,我们将向你展示如何在Mac上轻松地安装和管理多个Python环境。
422 5
 如何在Mac上安装多个Python环境
|
XML Java 数据格式
Spring高手之路18——从XML配置角度理解Spring AOP
本文是全面解析面向切面编程的实践指南。通过深入讲解切面、连接点、通知等关键概念,以及通过XML配置实现Spring AOP的步骤。
347 6
Spring高手之路18——从XML配置角度理解Spring AOP
|
存储 Swift
RxSwift+MVVM项目实战-多分组UITableView结合RxDataSources的使用
RxSwift+MVVM项目实战-多分组UITableView结合RxDataSources的使用
671 0
|
编解码 图计算 iOS开发
iPhone手机屏幕尺寸与倍图计算公式(更新至iPhone 14 Plus)
iPhone手机屏幕尺寸与倍图计算公式(更新至iPhone 14 Plus)
892 0
|
前端开发 开发者
在HTML中,可以使用字符实体`&copy;`来显示版权符号
【4月更文挑战第30天】在HTML中,可以使用字符实体`&copy;`来显示版权符号
2656 2

热门文章

最新文章