RxSwift---初体验(一)

随着Swift在iOS开发中比重越来越大,接下来这个篇章我们一起来探索下RXSwift,领略下Swift以及RXSwift的魅力

函数响应式编程

一:函数式

函数式编程简称FP(Functional Programming),它是一种抽象程度很高的编程范式

函数式编程的一个特点就是:允许把函数本身作为参数传入另一个函数,同时还允许返回一个函数!

y = f(x) ---> x = f(x) ---> y = f(f(x)) , y = f(x)这里的x就转换成x = f(x)

正所谓光说不练假把式,那么来这样一个需求

     1.获取 数组[1,2,3,4,5,6,7] 大于 3的数字
     2.获取到数字之后 + 1
     3.最后取出它们之中的偶数
        let array = [1,2,3,4,5,6,7]
        
        for num in array {
            //1获取大于3的数字
            if num > 3 {
                let number = num + 1 //获取到数字之后 + 1
                if number % 2 == 0 {
                    print(number) //取出它们之中的偶数
                }
            }
        }
  • 从上面的代码不难看出三个需求却嵌套了三层,实在是恶心~~~
  • 随着嵌套层数增加,代码的可读性会直线下降
  • 代码清晰度很差
  • 代码维护以及代码构建成本太高

这样函数式编程就很好的解决了这些问题

        array.filter { $0 > 3} //1获取大于3的数字
            .filter { ($0+1) % 2 == 0 }//获取到数字之后 + 1,取出它们之中的偶数
            .forEach{print($0+1)}
  • 代码层次非常清晰
  • 代码可读性高
  • 代码复用性高
  • 代码简洁,直接面向开发需求

二:响应式

  • 对象对某一数据流变化做出响应的这种编码方式称为响应式。

就好像我们在某一时刻订阅了一个视频,在此之后这个视频的作者再发新的作品,我们也能收到作品的推送

在iOS开发中经常会响应一些事件buttontextFieldtextViewNSTimer等等这些,都需要做响应监听,响应后都需要在对应的响应事件中去做处理,而原生开发中,触发对象与响应方法是分离的,如button的初始化和点击响应方法是分离的。功能代码与逻辑代码分析,导致很多比较恶心的感觉!

biu biu biu RxSwift闪亮✨登场

RxSwift简介

RxSwift 是 ReactiveX 家族的重要一员, ReactiveX 是 Reactive Extensions 的缩写,一般简写为 Rx。ReactiveX 官方给Rx的定义是:Rx是一个使用可观察数据流进行异步编程的编程接口。

RxSwfit有如下几个特性

  • 复合-Rx就是复合的代名词
  • 复用-因为它易复用
  • 清晰-因为声明都是不可变更的
  • 易用-因为它抽象了异步编程,使代码风格统一
  • 稳定-因为Rx是完全通过单元测试的
  • 框架跨平台性,RxSwift思想处处可用

一:button点击事件

    func setupButton() {
        //传统button添加ui事件 代码逻辑与事件逻辑分开 很恶心~~~~~
        self.button.addTarget(self, action: #selector(buttonAction(_:)), for: .touchUpInside)
        
        //Rx 功能逻辑和业务逻辑都在一起
        self.button.rx.controlEvent(.touchUpInside)
            .subscribe { _ in
                print("点击事件")
            }
            .disposed(by: disposeBag)
    }

二:textfiled文本响应

func setupTextFiled() {
        //如果需要监听textFiled输入值的变换
        //传统方式
//        self.textFiled.addTarget(self, action: #selector(<#T##@objc method#>), for: .valueChanged)
        //Rx
        self.textFiled.rx.text.orEmpty.changed
            .subscribe { text in
                print("监听到了 - \(text)")
            }
            .disposed(by: disposeBag)
    }

三:KVO

    func setupKVO() {
        //传统方式三步
        //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.removeObserver(self.person, forKeyPath: "name", context: nil)
    }

传统的方式使用KVO,我们从上面的代码可以感觉出来很恶心,我们看下RxSwift的实现方式

func setupKVO() {        
        //响应序列
        self.person.rx.observeWeakly(String.self, "name")
            .subscribe { value in
                print(value as Any)
            }
            .disposed(by: disposeBag)
    }
  • RxSwift温柔的一句代码搞定

RxSwift这个框架非常牛逼,把函数响应式玩到了高潮!接下来跟着我一起来玩一玩RxSwift吧

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容