01.RxSwift-初识

做为一个iOS开发人员, 当Swift赶上了RxSwift --> 函数响应式编程,在没有认识RxSwift以前,多是一脸的懵逼,即便偶尔使用一下也是丈二的和尚莫不着头脑,胡乱使用,可是当你认识了解并深刻探索之后,你会对RxSwift爱不释手,甚至忘记最初代码的写法!!!!git

函数响应式编程
1. 函数式 :
  • 函数式编程不是一种技术,而是一种高级抽象的编程思想设计,简称FP(Functional Programming)函数一词就直观的体现了这就是一个数学运算方法。它又分为两种形式:
  • 无反作用:函数没有变量,这种纯粹的函数式编程语言,一旦输入肯定,那么输出就是肯定的,它是没有反作用的。
  • 有反作用:函数有变量,这种函数式编程语言它的输入会随着变量不断的变化,最后的输出也就不肯定,它是存在反作用的。

函数表达式 : y = f(x) ---> x = f(x) ---> y = f(f(x))github

废话很少说,直接实例感觉一把:编程

/**
1. 首先获取 > 3的数字
2. 获取的数字以后 + 1
3.全部数字中的偶数
*/
let array = [1,2,3,4,5,6,7,8,9,10]
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) }

/**
  * 代码层次很是清晰
  * 代码可读性高
  * 代码复用性高
  * 代码简洁,直接面向开发需求
*/
复制代码
2. 响应式 :
  • 响应式编程是一种基于异步数据流概念的编程模式。数据流就像一条河:它能够被观测,被过滤,被操做,或者为新的消费者与另一条流合并为一条新的流。响应式编程的一个关键概念是事件。事件能够被等待,能够触发过程,也能够触发其它事件
  • 而iOS原生开发中,触发对象与响应方法是分离的,如button的初始化和点击响应方法是分离的。相似的还有taptextFieldtextViewnotifactionKVONSTimer等等。
RxSwift来源

RxSwiftRx家族 的重要一员,Rx就是复合的代名词, 不只仅是一种使用可观察数据流进行异步编程的接口,他更是一种编程思想理念的突破实践。它集结了多种编程模式和精华于一身,包括:观察者模式,迭代器,函数响应式编程等待。 RxSwift做为Rx家族的一员,同样继承了Rx的这一系列的特性。swift

RxSwift优点
  • RxSwiftSwift函数响应式编程的一个开源库:github地址, 其目的就是让可观察数据流、异步编程可以更好序列化,使用swift进行函数响应式编程。
  • 它拓展了观察者模式,使你可以自由组合多个异步事件,而不须要去关心线程同步线程安全并发数据以及I/O阻塞
  • RxSwiftRxSwift 语言开发的一门函数响应式编程语言, 它能够代替iOS系统的 Target Action,代理, 闭包,通知,KVO,同时还提供网络,数据绑定,UI事件处理,UI的展现和更新,多线程……
RxSwift学习必要性
  • 复合 - Rx 就是和复合的代名词
  • 复⽤用 - 复⽤用性⽐比较强 - 代码量量下降
  • 清晰 - 由于声明都是不不可变动更,代码函数式编程可读性强
  • 易易⽤用 - 理理解容易易,还抽象的了了异步编程,统⼀代码⻛风格
  • 稳定 - 由于 Rx 是彻底经过单元测试的
RxSwift初识
1.KVO
//MARK: - KVO-原始三部曲
//1.添加观察者
self.person.addObserver(self, forKeyPath: "name", options: .new, context: nil)

//2.实现观察者方法
override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
        print("响应")
        print(change as Any)
  }
    
//3.移除观察者
  deinit {
        self.person.removeObserver(self, forKeyPath: "name")
    }
复制代码
//MARK: - RxSwift应用-KVO
func setupKVO() {
        self.person.rx.observeWeakly(String.self, "name")
            .subscribe(onNext: { (value) in
                print(value as Any)
            })
            .disposed(by: disposeBag)
    }
复制代码
2.UI层
  • UIButton
//MARK: - button原始是写法
self.button.addTarget(self, action: #selector(click), for: .touchUpInside)

func click() {
  print("点击")
}
复制代码
//MARK: - RxSwift应用-button响应
 func setupButton() {
  self.button.rx.tap
     .subscribe(onNext: { () in
         print("点击来了")
     })
     .disposed(by: disposeBag)
//上面的代码和下面的意思同样
   self.button.rx.controlEvent(.touchUpInside)
            .subscribe(onNext: { () in
                print("点击了")
            })
            .disposed(by: disposeBag)
}
复制代码
  • UITextFiled
//MARK: - RxSwift应用-textfiled
func setupTextFiled() {
    // 咱们若是要对输入的文本进行操做 - 好比输入的的内容 而后咱们获取里面的偶数
    // self.textFiled.delegate = self
    // 感受是否是特别恶心
    // 下面咱们来看看Rx
    self.textFiled.rx.text.orEmpty.changed.subscribe(onNext: { (text) in
        print("监听到了 - \(text)")
    }).disposed(by: disposeBag)
    
    self.textFiled.rx.text.bind(to: self.button.rx.title()).disposed(by: disposeBag)
}
复制代码
  • UIScrollView
//MARK: - RxSwift应用-scrollView
func setupScrollerView() {
        scrollView.rx.contentOffset
            .subscribe(onNext: { [weak self](content) in
                self?.view.backgroundColor = UIColor.init(red: content.y/255*0.8, green: content.y/255*0.6, blue: content.y/255*0.3, alpha: 1)
            })
        .disposed(by: disposeBag)
    }
复制代码
  • Tap手持
//MARK: - 手势
func setupGestureRecognizer(){
        let tap = UITapGestureRecognizer()
        self.label.addGestureRecognizer(tap)
        self.label.isUserInteractionEnabled = true
        tap.rx.event.subscribe(onNext: { (tap) in
            print(tap.view)
        })
        .disposed(by: disposeBag)
    }
复制代码
3.通知
//MARK: - 通知
func setupNotification(){
    NotificationCenter.default.rx
        .notification(UIResponder.keyboardWillShowNotification)
        .subscribe { (event) in
            print(event)
    }.disposed(by: disposeBag)
}
复制代码
4.NSTimer
//MARK: - RxSwift应用-timer定时器
func setupTimer() {
    timer = Observable<Int>.interval(1, scheduler: MainScheduler.instance)
    timer.subscribe(onNext: { (num) in
        print("hello word \(num)")
    }).disposed(by: disposeBag)
}
复制代码
5.网络
//MARK: - RxSwift应用-网络请求
func setupNextwork() {
    let url = URL(string: "https://www.baidu.com")
    URLSession.shared.rx.response(request: URLRequest(url: url!))
        .subscribe(onNext: { (response, data) in
            print("response ==== \(response)")
            print("data ===== \(data)")
        }, onError: { (error) in
            print("error ===== \(error)")
        }).disposed(by: disposeBag)
}
复制代码

Rx 之前:安全

  • KVO三部曲很恶心,不直观
  • UI层 须要设置代理或者addTarget,代码逻辑与事件逻辑分层
  • 通知的实现,也是比较友善的:编程习惯都有在RxSwift风格里面保留,下降了开发门槛
  • 手势看是去仍是很不爽,仍是须要添加到视图上,可扩展一层再次处理,这样就行了
  • Timer根据建立受RunLoop影响,还要手动销毁,还可能有线程问题

Rx 之后:bash

  • RxSwift温柔的一句代码搞定,腰也不疼了,腿也不酸了,一口气直接上6楼,timer还不受RunLoop影响了,也不用手动管理了,线程这些也都安全了
总结
  • 简单的rx体验,就能让人感受,真的是到处皆rx,并且清晰简洁,分段式操做,函数式响应。对比原始写法,一个字爽~
  • 把函数响应式玩到了高潮!不管从代码量,仍是从代码的可读性,抑或代码的复用性......都是大大优化!
    图片.png
相关文章
相关标签/搜索