打开RxSwift大门

315 阅读3分钟

前言

Rx是ReactiveX的缩写,基于异步事件序列的响应式编程

其能提供优雅的数据绑定简化异步编程方法,能够时刻响应新的数据变化并能顺序地处理他们

为什么要学RxSwift

swif是静态语言,不像oc有个运行时可以动态地发消息,不能及时处理响应、消息等动态的方式,因此RxSwift来弥补缺陷,其有官方的框架叫Combine。

1、函数响应式编程(FRP)

函数响应式编程其实就是函数式编程和响应式编程的融合

  • 函数式:可以将函数作为另一个函数的输入值和输出值

举个例子:

//给一个数组进行如下操作
// 首先获取 > 3的数字
// 获取的数字之后 + 1
// 所有数字中的偶数

let array = [1, 2, 3, 4, 5, 6, 7]

//普通编程思维
for num in array {
    if num > 3 {
        let number = num + 1
        if (number % 2 == 0) {
            print(number)
        }
    }
}

//函数式思维,使用高级函数
array.filter { $0 > 3 }
     .filter { ($0+1) % 2 == 0 }
     .forEach { print($0+1) }
  • 响应式:基于数据流和变化来进行传递的一种声明式编程方式
//        int a = 10
//        int b = a + 10
//        a += 10
//        print(a, b)

//如果想要ba进行变化,那么就要绑定a或者订阅a来监听b进行变化,这就是响应式的要实现的目的,比如KVO

2、RXSwift应用

这里举例几个常用的应用场景来感受下RXSwift的魅力

首先通过cocoapods引进RXSwift库,在podfile加入下面代码

    pod 'RxSwift', '6.5.0'
    pod 'RxCocoa', '6.5.0'

kvo

实现:点击按钮去改变某个变量,然后触发打印

观察者的方式:

//注册
self.person.addObserver(self, forKeyPath: "name", options: .new, context: nil)

//改变变量,可以在点击事件里改变name
person.name = "(person.name) 6"

//响应
 override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
    print("响应")
    print(change as Any)
 }

// 释放
deinit {
    self.removeObserver(self.person, forKeyPath: "name", context: nil)
}

RX方式实现:

//响应序列
        self.person.rx.observeWeakly(String.self, "name")//注册
            .subscribe { value in
                print(value as Any)//响应
            }
            .disposed(by: disposeBag)//销毁
//改变变量,可以在点击事件里改变name
person.name = "(person.name) 6"

可以看到RX方式的简洁,同时将注册、响应、销毁放到一起,有利于理解和阅读

button响应

self.button.rx.controlEvent(.touchUpInside)
            .subscribe { _ in
                print("点击事件")
                
            }
            .disposed(by: disposeBag)

textfiled

self.textFiled.rx.text.orEmpty.changed
            .subscribe { text in
                print(text)
            }
            .disposed(by: disposeBag)

手势

let tap = UITapGestureRecognizer()
        self.label.addGestureRecognizer(tap)
        self.label.isUserInteractionEnabled = true
        tap.rx.event.subscribe { tap in
            print(tap.view!)
        }
        .disposed(by: disposeBag)

通知

NotificationCenter.default.rx.notification(UIResponder.keyboardWillShowNotification)
            .subscribe { noti in
                print(noti)
            }
            .disposed(by: disposeBag)

timer定时器

timer = Observable<Int>.interval(.seconds(1), scheduler: MainScheduler.instance)
        timer.subscribe { num in
            print(num)
        }
        .disposed(by: disposeBag)

通过这些demo,我们可以看到RXSwift给我们带来的新的编码方式,那么为什么万物皆可RX呐?下面一起通过源码的阅读来一起里了解RXSwift的核心原理吧

3、RXSwift核心原理

  • 万物皆可以rx

我们可以先点击进rx里,看看这个rx是个什么,从源码可以看到rx是一个协议的关联类型,只要我在NSObject实现这个协议,那么继承于NSObject的类就都可以使用RX了

源码中NSObject扩展使用了ReactiveCompatible这个协议,因此万物皆可rx

小结

本文主要引出RxSwift的概念,列举几个比较实用的有关RxSwift的demo,体验下RxSwift的魅力,以及万物皆Rx的由来。