RxSwift(1)-初识RxSwift

简介

Rx简介

RxSwiftRx家族对swift语言的封装。什么是Rx呢?全称是ReactiveX。官方对自己的定义如下:

An API for asynchronous programming with observable streams

一组带有可观察流的异步编程APIReactiveX结合了观察者模式(Observer pattern)、迭代器模式(Iterator pattern)、函数式编程(functional programming)的思想。

ReactiveX通过使用可观察的序列来组合异步和基于事件的程序。它扩展了观察者模式以支持数据和事件序列,并且允许使用运算符将各种序列组合起来处理。这样不仅简化了异步事件响应的复杂度,同时消除了低级线程、同步、线程安全、并发数据结构等问题。

RxSwift简介

RxSwift作为Rx的一员,它结合了传统Cocoa编程和纯函数编程的优点。它允许对事件作出反应,方法是使用不可变的代码定义以确定性的、可组合的方式处理异步输入部分。

RxSwift的核心组成部分如下:

  • observable:可观察序列,响应事件、订阅事件
  • observer:观察者,观察事件、发送信号
  • operator:操作符,组合变换观察者信号
  • scheduler:调度,调度观察事件的执行
  • disposable:管理事件订阅的生命周期

可以说Observable就是Rx的基础:任何事件或者任务的执行都可以携带信号,而这些信号又可以被任何订阅了类或者对象使用。不管是同步或者异步,只要是信号发出,订阅者必然能够接受到。

RxSwift的事件类型分为以下三种:

  • next:下一个事件,可以理解为发送正常的信号、传递数据事件
  • error:错误事件,发送出错误信号,意味着发送者不会发出其他事件,而接收者也不会再接收到信号。
  • completed:完成事件,意味着观察序列终止,发送者不会发出任何其他事件,而接收者也不会再接收到信号。在发送的时候,completederror只能出现一个。

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,我们只需要关注被观察者的变化,而不需要在意如何观察、如何回调、何时移除观察者。
  • 复合性强,可以实现多事件的复合叠加、多控件中间的复合绑定
  • 代码的复⽤性比较高,能够降低代码量
  • 代码逻辑清晰,更好的分离不同层面的业务;而且声明都是不可变的,可读性强
  • 便于单元测试
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,657评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,662评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,143评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,732评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,837评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,036评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,126评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,868评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,315评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,641评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,773评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,859评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,584评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,676评论 2 351

推荐阅读更多精彩内容

  • 概述 RxSwift顾名思义是Swift的一种框架,您或许曾经听说过「响应式编程」(Reactive Progra...
    Mr大喵喵阅读 1,862评论 3 4
  • 本文章内部分图片资源来自RayWenderlich.com 本文结合自己的理解来总结介绍一下RxSwift最基本的...
    FKSky阅读 2,869评论 4 14
  • RxSwift 使用详解系列 Rx Rx是ReactiveX的缩写,简单来说就是基于异步事件序列的响应式编程。Rx...
    内心强大的Jim阅读 820评论 0 0
  • 前言 写这篇文章是为了记录下自己在对于RxSwift的学习过程中的概念理解,操作步骤以及心得体会,以便于在以后复习...
    Henry_Jeannie阅读 410评论 0 3
  • 今早没跟娴一起吃早餐,昨晚洗洗后11点多才睡,所以就睡个懒觉吧。 睡到9点的时候还是睡不下去了,起床。准备洗床单,...
    L林零阅读 130评论 0 0