RxSwift(1)-初识RxSwift
简介
Rx
简介
RxSwift
是Rx
家族对swift
语言的封装。什么是Rx
呢?全称是ReactiveX
。官方对自己的定义如下:
An API for asynchronous programming with observable streams
一组带有可观察流的异步编程API
。ReactiveX
结合了观察者模式(Observer pattern)
、迭代器模式(Iterator pattern)
、函数式编程(functional programming)
的思想。
ReactiveX
通过使用可观察的序列来组合异步和基于事件的程序。它扩展了观察者模式以支持数据和事件序列,并且允许使用运算符将各种序列组合起来处理。这样不仅简化了异步事件响应的复杂度,同时消除了低级线程、同步、线程安全、并发数据结构等问题。
RxSwift
简介
RxSwift
作为Rx
的一员,它结合了传统Cocoa
编程和纯函数编程的优点。它允许对事件作出反应,方法是使用不可变的代码定义以确定性的、可组合的方式处理异步输入部分。
RxSwift
的核心组成部分如下:
-
observable
:可观察序列,响应事件、订阅事件 -
observer
:观察者,观察事件、发送信号 -
operator
:操作符,组合变换观察者信号 -
scheduler
:调度,调度观察事件的执行 -
disposable
:管理事件订阅的生命周期
可以说Observable
就是Rx
的基础:任何事件或者任务的执行都可以携带信号,而这些信号又可以被任何订阅了类或者对象使用。不管是同步或者异步,只要是信号发出,订阅者必然能够接受到。
RxSwift
的事件类型分为以下三种:
-
next
:下一个事件,可以理解为发送正常的信号、传递数据事件 -
error
:错误事件,发送出错误信号,意味着发送者不会发出其他事件,而接收者也不会再接收到信号。 -
completed
:完成事件,意味着观察序列终止,发送者不会发出任何其他事件,而接收者也不会再接收到信号。在发送的时候,completed
和error
只能出现一个。
RxSwift
简单使用
RxSwift
对很多事件和机制都做了封装,可以更方便的使用
KVO
func testKVO() {
self.person.rx.observeWeakly(String.self, "name")
.subscribe(onNext: { (value) in
print(value ?? "")
})
.disposed(by: disposeBag)
}
Notification
func testNotification(){
NotificationCenter.default.rx.notification(UIResponder.keyboardWillShowNotification)
.subscribe(onNext: { (noti) in
print(noti)
})
.disposed(by: disposeBag)
}
Delegate
func testScrollerView() {
scrollView.rx.contentOffset
.subscribe(onNext: { [weak self](content) in
print(content)
})
.disposed(by: disposeBag)
}
UI
事件响应
UITextField
UITextField
响应代理:
func testTextFiled() {
self.textFiled.rx.text.orEmpty
.subscribe(onNext: { (text) in
print(text)
})
.disposed(by: disposeBag)
}
控件绑定,将输入框的文案,绑定到按钮上。
self.textFiled.rx.text
.bind(to: self.button.rx.title())
.disposed(by: disposeBag)
UIButton
func testButton() {
self.button.rx.tap
.subscribe(onNext: { () in
print("点击事件")
})
.disposed(by: disposeBag)
// 修改button的事件类型
self.button.rx.controlEvent(.touchUpOutside)
}
UIGestureRecognizer
func testGestureRecognizer(){
let tap = UITapGestureRecognizer()
self.label.addGestureRecognizer(tap)
self.label.isUserInteractionEnabled = true
tap.rx.event.subscribe(onNext: { (tap) in
print(tap)
})
.disposed(by: disposeBag)
}
定时器
RxSwift
封装了定时器,该定时器并不会受到scrollView
滑动的影响。它并不是对NSTimer
的封装。
func testTimer() {
let timer = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
timer.subscribe(onNext: { (num) in
print(num)
})
.disposed(by: disposeBag)
}
网络请求
func testNextwork() {
let url = URL(string: "")
URLSession.shared.rx.response(request: URLRequest(url: url!))
.subscribe(onNext: { (response,data) in
print(response)
})
.disposed(by: disposeBag)
}
从上述的例子可以看到,我们的对象在实例化之后都有rx
这个属性,那么这是为什么呢?其实这是因为在RxSwift
中给NSObject
实现了ReactiveCompatible
协议,所以能获取到rx
这个属性。
public protocol ReactiveCompatible {
/// Extended type
associatedtype CompatibleType
/// Reactive extensions.
static var rx: Reactive<CompatibleType>.Type { get set }
/// Reactive extensions.
var rx: Reactive<CompatibleType> { get set }
}
extension NSObject: ReactiveCompatible { }
使用RxSwift
的必要性
swift
是一门静态语言,Objective-C
的很多动态特性是无法使用的,而RxSwift
则很好的弥补这个缺点。总结一下,RxSwift
有以下优点
- 简单易用,大量的封装了无关业务的实现,让程序员只关注自己想要的东西。比如说,使用
KVO
,我们只需要关注被观察者的变化,而不需要在意如何观察、如何回调、何时移除观察者。 - 复合性强,可以实现多事件的复合叠加、多控件中间的复合绑定
- 代码的复⽤性比较高,能够降低代码量
- 代码逻辑清晰,更好的分离不同层面的业务;而且声明都是不可变的,可读性强
- 便于单元测试