iOS Swift之RxSwift初探
RxSwift: ReactiveX for Swift
那么为什么要使用 RxSwift ?
- 复合 - Rx 就是复合的代名词
- 复用 - 因为它易复合
- 清晰 - 因为声明都是不可变更的
- 易用 - 因为它抽象了异步编程,使我们统一了代码风格
- 稳定 - 因为 Rx 是完全通过单元测试的
RxSwift的引入
Podfile文件target中添加一下代码并pod update 、、或者手动下载拖出代码模块
pod 'RxSwift', '6.5.0'pod 'RxCocoa', '6.5.0'
RxSwift的基础应用与传统应用对比
1、Target Action
正常写法
button.addTarget(self, action: #selector(buttonTapped), for: .touchUpInside)@objc func buttonTapped() {print("button Tapped")
}
RxSwift写法
button.rx.tap.subscribe{ event inprint("按钮点击执行")}.disposed(by: bag)//或者
button.rx.tap.subscribe(onNext: {print("按钮点击执行111")}).disposed(by: bag)
通过Rx使得代码逻辑清晰可见。
2、代理
传统实现方法:
class RxBaseController:UIViewController,UITextFieldDelegate{...textfield.delegate = self//textfield代理监控func textFieldDidChangeSelection(_ textField: UITextField) {print("文字变化:\(textField.text!)")}func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {if textField.text!.count > 4 {return false}return true}}
使用Rx实现
textfield.rx.text.subscribe{event inprint("输入值变化:(event.element)")}.disposed(by: bag)// 或者textfield.rx.text.subscribe (onNext: {string inprint("输入变化:\(string!)")}).disposed(by: bag)//将当前文本内容绑定到label上textfield.rx.text.bind(to: lb.rx.text).disposed(by: bag)
3、闭包回调
传统实现方式
let url = URL.init(string: "https://www.qctt.cn/home")URLSession.shared.dataTask(with: URLRequest.init(url: url!)) { data, response, error inguard error == nil else{print("Data Task Error: \(error!)")return}guard let data = data else{print("Data Task Error: unknown")return}print("Data Task Success with count: \(data.count)")}.resume()
Rx实现方式
//Rx实现方式URLSession.shared.rx.response(request: URLRequest.init(url: url!)).subscribe{ response,data inprint(data,response)} onError: { Error inprint(Error)}.disposed(by: bag)
回调也变得十分简单,错误和返回结果分离,逻辑更加清晰。
4、通知
传统实现方式
override func viewDidLoad() {self.view.backgroundColor = UIColor.whiteNotificationCenter.default.addObserver(forName:.NSExtensionHostWillEnterForeground, object: nil, queue: nil){ (notification) inprint("Application Will Enter Foreground")}}deinit {NotificationCenter.default.removeObserver(self)}
Rx实现方式
NotificationCenter.default.rx.notification(.NSExtensionHostWillEnterForeground).subscribe(onNext: { (notification) inprint("Application Will Enter Foreground")}).disposed(by: bag)
你不需要去管理观察者的生命周期,这样你就有更多精力去关注业务逻辑。
5、多个任务之间有依赖关系
例如,先通过用户名密码取得 Token 然后通过 Token 取得用户信息,
传统实现方法:
class UserInfo{var name = ""var age = 0var sex = 0
}
enum API {//通过用户名密码获得一个接口static func token(username:String,password:String,sucess:(String)->Void,failure:(Error)->Void){print("获取token")}//通过token获取用户信息static func userinfo(token:String,suecess:(UserInfo)->Void,failure:(Error)->Void){print("获取用户信息")}
调用方式
API.token(username: "wy", password: "pass", sucess: {token inAPI.userinfo(token: token, suecess: {userinfo inprint(userinfo)}, failure: { error inprint("获取用户信息失败: \(error)")})}, failure: { error inprint("获取用户信息失败: \(error)")})
通过 Rx 来实现:
封装接口/// 通过用户名密码取得一个 tokenstatic func token(username:String,password:String)->Observable<String>{}/// 通过 token 取得用户信息static func userInfo(token:String)->Observable<UserInfo>{}调用/// 通过用户名和密码获取用户信息APIRx.token(username: "ddd", password: "ppp").flatMapLatest(APIRx.userInfo).subscribe(onNext: {userInfo inprint("获取用户信息成功: \(userInfo)")}, onError: {error inprint("获取用户信息失败: \(error)")}, onCompleted: {}).disposed(by: DisposeBag.init())
这样处理代码更加简洁。
6、等待多个并发任务完成后处理结果
例如,需要将两个网络请求合并成一个,
/// 用 Rx 封装接口
enum API {/// 取得老师的详细信息static func teacher(teacherId: Int) -> Observable<Teacher> { ... }/// 取得老师的评论static func teacherComments(teacherId: Int) -> Observable<[Comment]> { ... }
}
/// 同时取得老师信息和老师评论
Observable.zip(API.teacher(teacherId: teacherId),API.teacherComments(teacherId: teacherId)).subscribe(onNext: { (teacher, comments) inprint("获取老师信息成功: \(teacher)")print("获取老师评论成功: \(comments.count) 条")}, onError: { error inprint("获取老师信息或评论失败: \(error)")}).disposed(by: disposeBag)
iOS Swift之RxSwift初探相关推荐
- PodfileKit将github上常见的iOS(Swift)第三方框架进行了汇总,并且将框架进行了分类,为用户管理第三方框架提供了方便。
PodfileKit ======================== Easy Podfile ! PodfileKit将github上常见的iOS(Swift)第三方框架进行了汇总,并且将框架进行 ...
- IOS swift项目的单例模式.swift5以后的单例模式
IOS swift项目的单例模式.swift5以后的单例模式 不能继承NSObject 第一种写法,最简单 class SoundTools{static let sharedInstance = S ...
- ios swift 实现饼状图进度条,swift环形进度条
ios swift 实现饼状图进度条 // // ProgressControl.swift // L02MyProgressControl // // Created by plter on 7/2 ...
- iOS Swift 使用 CLLocationManager 定位
iOS Swift 使用 CLLocationManager 定位 CLLocationManager 是IOS 系统提供的定位对象,通过该对象可以获取定位信息,包括:经纬度.海拔.方向.速度.通过反 ...
- ios swift 纯代码设置UITableViewCell的style
1.dequeueReusableCell(withIdentifier:)方法不需要注册 func tableView(_ tableView: UITableView, cellForRowAt ...
- IOS Swift 入门学习汇总 (更新中..)
IOS Swift 学习入门 配置区 info 配置 本地化中文 文件导入Xcode CocoaPads 依赖管理工具 UI区 + 代码 通用 打开新页面方式 设置新开页面全屏展示 跳转页面 正向传值 ...
- iOS Swift 高仿微信
LXFWeChat Swift 3.0 高仿微信 两个测试账号: lxf lqr 密码都是123456 源码地址 码云 http://git.oschina.net/LinXunFeng/LXFWe ...
- iOS swift 蓝牙详解(蓝牙中心demo,蓝牙外设demo(可替代mac蓝牙串口调试工具),蓝牙中心框架,gif演示)
持续更新中... 文章目录 1.gif演示 1.1 蓝牙中心app 1.2 蓝牙外设app(外设被一个设备连接后,还可以被另一个设备连接,但两个同时连会导致连接不稳定,容易断开) 1.3 写write ...
- ios swift 聊天_iOS Swift上的加密聊天
ios swift 聊天 In this tutorial, we'll build encrypted chat on iOS using Swift. We'll combine Stream C ...
- IOS - swift SDK开发
IOS - swift SDK 开发 创建私有库 创建私有库 pod lib create 仓库名 根据提示选择自己所需的选项 开发自己的sdk代码,将代码置于classes中 创建远程仓库,关联仓库 ...
最新文章
- 【错误记录】NDK 导入外部 so 动态库报错 ( java.lang.UnsatisfiedLinkError | Android Studio 配置外部 so 动态库两种方法 )
- 常用Nagios配置命令
- 取生产订单状态的逻辑
- vue-cli,webpack安装
- geotrellis使用(二十九)迁移geotrellis至1.1.1版
- 湖南省普通高等学校计算机应用水平,湖南省普通高等学校非计算机专业学生计算机应用水平二级考试大纲...
- 2017.10.11 Problem c 失败总结
- Spark学习-SparkSQL--03-SparkSQL CLI 建表查询出问题
- JS 没有块级作用域
- ardupilot在Linux上设置SITL(FlightGear)
- 用n=4的复化Simpson公式求积分方程的近似解[matlab]
- 【企业网络】我在51cto技术门诊的提问以及专家的解答汇总
- 蓝桥杯题库及答案python版_蓝桥杯试题库的历届真题版.doc
- logback出现大量XXX_IS_UNDEFINED日志文件的问题
- 股票自选股基本函数大全-7
- jsplumb插件学习--单个节点动态添加多个锚点
- 讯搜 配置mysql_迅搜使用指南
- incident用法_incident与_accident区别
- android apk 反编译 工具下载,android APK反编译工具Apktool
- Dragon boat festival