从今天开始主要开始讲解RxSwfit的使用
大家都知道iOS 目前主流的开发语言一个Objective-C还有一个就是Swift,还有人说SwiftUI,这里要说明一下SwiftUI并不是开发语言,它是一个UI框架,是苹果2019年推出的新的UI框架,但是SwiftUI最低需要iOS13,版本要求过高,而我们在开发过程中还要兼容很低版本,例如我们公司最低兼容iOS9.0,所以SwiftUI就得放弃了,所以这里我们不做介绍,而Objective-C还、Swift这两个语言都满足开发应用的要求,那么为什么现在OC开发的人开始日益减少了呢,而Swift却明显的呈现上升趋势呢?
下面我就来简单的说一下Swift相对于OC的优势。
优点:
1、 简洁的语法:
我们不得不承认的是swift语言比OC精简,整个项目中丢掉了头文件,以及头文件的引入。
2、报错精准:
报错的时候直接显示报错行。
3、定义变量简单:
定义变量不用区分整型,浮点型等等,变量使用var,常量使用let,并且还带来元组。
4、可视化互动效果:
开发工具带来了Xcode Playgrounds功能,该功能提供强大的互动效果,能让Swift源代码在撰写过程中实时显示出其运行结果。
5、函数式编程的支持:
Swift 语言本身提供了对函数式编程的支持;
Objc 本身是不支持的,通过引入 ReactiveCocoa 这个库才可支持函数式编程。
随着Swift越来越成熟、越来越稳定,他的功能覆盖的也越来越强大,而今天的RxSwfit让具有函数式编程的Swift还有响应式编程的能力。
什么是响应式编程呢?
响应式编程是一种面向数据流和变化传播的编程范式。这意味着可以在编程语言中很方便地表达静态或动态的数据流,而相关的计算模型会自动将变化的值通过数据流进行传播。
上面说的都是Swift的优势,那RxSwift又是什么呢
RxSwift介绍
说到RxSwift就要说的ReactiveX,RxSwift 是 ReactiveX中一个,ReactiveX还有 RxJava
, RxJS
, RxKotlin
, Rx.NET
等等。
ReactiveX
是 Reactive Extensions
的缩写,一般简写为Rx。
ReactiveX
官方给Rx的定义是,Rx
是一个使用可观察数据流进行异步编程的编程接口。ReactiveX
不仅仅是一个编程接口,它是一种编程思想的突破,它影响了许多其它的程序库和框架以及编程语言。它拓展了观察者模式,使你能够自由组合多个异步事件,而不需要去关心线程,同步,线程安全,并发数据以及I/O阻塞。RxSwift
是Rx
为Swift
语言开发的一门函数响应式编程语言, 它可以代替iOS
系统的Target Action
/代理
/闭包
/通知
/KVO
…..
同时还提供网络、数据绑定、UI事件处理、UI的展示和更新、多线程……
想要更详细的了解RxSwift可以前往查看RxSwift主页查看以及RxSwift中文文档
下面我来简单的说一下RxSwift的使用
RxSwift是一个库,我们只要引入即可使用,这里我以CocoaPods为例
1、首先我们创建一个项目然后进入工程目录下输入下面的命令
pod init
然后会生成Podfile文件,然后在Podfile文件输入下面内容既可
# Rx
pod 'RxSwift'
pod 'RxCocoa'
pod 'RxDataSources'
2、然后我们再输入下面命令等待安装即可
pod install
下面就是RxSwfit的使用了
1、打开工程找到要使用RxSwift的地方引包即可
import RxSwift
import RxCocoa
2、下面就是使用了,我们今天就现以最简单的UILabel为例,大家都知道UILabel就是一个展示文字的作用,所以这里我们就以UILabel的普通文本展示和富文本展示两种进行演示,由于UILabel是一个展示作用,所以这里我要使用定时器,而RxSwfit也对定时器进行了处理,下面就是RxSwfit定时器的创建
//Observable - 可监听序列,0.1 代表的是执行间隔, MainScheduler.instance主线程并解决了很多缺陷,这里只演示使用,如果想要了解这些可以参考下面链接
//🔗https://beeth0ven.github.io/RxSwift-Chinese-Documentation/content/rxswift_core/observable.html
let timer = Observable<Int>.interval(0.1, scheduler: MainScheduler.instance)
我们通过Xib或者storyboard拖拽一个UILabel控件
@IBOutlet weak var label: UILabel!
1、普通文本,上面定时器创建和UILabel成功了,下面就是要接受定时器的执行事件
/// 普通文本,timer.map是一个闭包,对swift了解的应该知道$0是代表什么就是闭包里的内容,这里就代表定时累计执行的内容,bind(to: label.rx.text),很好理解,就是将闭包里的内容绑定到Label的text上进行展示
func displayOrdinaryText() {
timer.map {
String(format: "%0.2d:%0.2d.%0.1d", arguments: [($0 / 600) % 600, ($0 % 600 ) / 10, $0 % 10])
}.bind(to: label.rx.text).disposed(by: disposeBag)
}
2、富文本
/// 富文本和普通文本没有太大差别,最大差别就是.bind(to: label.rx.text)替换成attributedText
func displayTheRichText() {
timer.map(
formatTimeInterval(ms:)
).bind(to: label.rx.attributedText).disposed(by: disposeBag)
}
/// 富文本
/// - Parameter ms: 时间
func formatTimeInterval(ms: NSInteger) -> NSMutableAttributedString {
let string = String(format: "%0.2d:%0.2d.%0.1d",arguments: [(ms / 600) % 600, (ms % 600 ) / 10, ms % 10])
//富文本设置
let attributeString = NSMutableAttributedString(string: string)
//从文本0开始6个字符字体HelveticaNeue-Bold,16号
attributeString.addAttribute(NSAttributedString.Key.font,
value: UIFont(name: "HelveticaNeue-Bold", size: 16)!,
range: NSMakeRange(0, 5))
//设置字体颜色
attributeString.addAttribute(NSAttributedString.Key.foregroundColor,
value: UIColor.white, range: NSMakeRange(0, 5))
//设置文字背景颜色
attributeString.addAttribute(NSAttributedString.Key.backgroundColor,
value: UIColor.orange, range: NSMakeRange(0, 5))
return attributeString
}
3、下面附上完整代码
import UIKit
import RxSwift
import RxCocoa
class LabelVC: ViewController {
@IBOutlet weak var label: UILabel!
let timer = Observable<Int>.interval(0.1, scheduler: MainScheduler.instance)
override func viewDidLoad() {
super.viewDidLoad()
displayOrdinaryText()
// displayTheRichText()
}
/// 普通文本
func displayOrdinaryText() {
timer.map {
String(format: "%0.2d:%0.2d.%0.1d", arguments: [($0 / 600) % 600, ($0 % 600 ) / 10, $0 % 10])
}.bind(to: label.rx.text).disposed(by: disposeBag)
}
/// 富文本
func displayTheRichText() {
timer.map(
formatTimeInterval(ms:)
).bind(to: label.rx.attributedText).disposed(by: disposeBag)
}
/// 富文本
/// - Parameter ms: 时间
func formatTimeInterval(ms: NSInteger) -> NSMutableAttributedString {
let string = String(format: "%0.2d:%0.2d.%0.1d",arguments: [(ms / 600) % 600, (ms % 600 ) / 10, ms % 10])
//富文本设置
let attributeString = NSMutableAttributedString(string: string)
//从文本0开始6个字符字体HelveticaNeue-Bold,16号
attributeString.addAttribute(NSAttributedString.Key.font,
value: UIFont(name: "HelveticaNeue-Bold", size: 16)!,
range: NSMakeRange(0, 5))
//设置字体颜色
attributeString.addAttribute(NSAttributedString.Key.foregroundColor,
value: UIColor.white, range: NSMakeRange(0, 5))
//设置文字背景颜色
attributeString.addAttribute(NSAttributedString.Key.backgroundColor,
value: UIColor.orange, range: NSMakeRange(0, 5))
return attributeString
}
}
这里只是一个参考,RxSwfit拥有更方便的功能。
到这里可能很多小伙伴并没有RxSwift到底有多强,感觉也没有少很多代码啊,可是大家要知道,UILabel就是一个最简单控件了,他就是一个赋值展示的作用,可是后期当我们学习到TableView、CollectionView以及RxSwift+MVVM+Moya时,你就会发现RxSwift真正强大的地方。
下面是本人学习过程自己写的一个demo,感兴趣的小伙伴大家可以下载看一看。