RxSwift:1.初识RxSwift

本教程在向读者介绍RxSwift库以及如何使用Swift编写响应式的iOS App.react

问题来了, 什么是RxSwift呢? 这里有一段介绍:git

RxSwift是一个库,经过使用可观察序列和函数式操做符组合异步和基于事件的代码,容许经过调度程序参数化执行。github

1

听起来好像很复杂, 可是请别担忧, 若是咱们一开始就要去了解编写响应式的程序, 理解程序背后的概念, 以及查看大量的经常使用术语, 那确定是让人很头疼的.web

可是本教程的目标是: 经过解释若是使用每个API, 而且简单的介绍它们在iOS app中的实际使用, 而后再慢慢介绍RxSwift的各类API以及Rx的概念.编程

如今咱们将从RxSwift的基本特性开始, 而后逐渐学习中级以及高级的课题, 在学习的过程当中, 咱们会花大量的时间练习新概念, 让你能够更加容易的掌握RxSwift, Rx是一个很是普遍的课题, 不可能全部东西都包含在本教程中, 刚开始的目的是让你对库有一个坚实的了解, 而后你在根据所学的Rx知识再扩展本身得Rx技能.swift

如今, 咱们从一个简单, 可理解的定义开始, 并在本章节后面讨论反应时编程的课题是, 逐步发展到一个更好更宽广的解释.数组

RxSwift本质上简化了异步程序的开发, 它容许代码对新数据做出反应, 而且以顺序的, 隔离的方式处理它.ruby

做为一个iOS App开发人员, 这样子的解释更加通俗易懂, 并且能够明确的告诉你RxSwift的做用.网络

即便如今你仍然不清楚细节, 也能够知道RxSwift就帮助你来编写异步代码, 并且咱们都知道要开一个好的, 肯定性的异步代码是很是困难的, 若是有其余库能够帮助咱们的话, 那确定是很是受欢迎的.闭包

异步编程的介绍

若是咱们试图用一种简单, 实际的语言来解释什么是异步编程, 可能会获得如下内容.

iOS App, 在任什么时候候均可能在作如下的任何事情, 甚至更多:

  • 对按钮点击作出反应
  • 显示键盘或者是隐藏键盘
  • 从网上下载一张大的照片
  • 将数据存储在本地的磁盘中
  • 播放音频

全部的这些事情几乎都是在同一时间发生, 当键盘隐藏键盘的时候, 一直到键盘彻底的隐藏, 应用程序中的音频是不会暂停的, 是吧?

图片

而且程序中的全部不一样的部分都不会互相阻塞执行, 由于iOS提供了各类的API, 容许咱们在不一样的线程上执行不一样的工做, 并在设备不一样的CPU核心上执行它们.

然而, 当咱们真正去编写这部分异步代码的时候是很是困难的, 尤为是当不一样的代码须要处理相同的数据时, 很难想象哪段代码先更新数据, 或者是哪段代码读取最新的值.

Cocoa和UIKit的异步API

苹果在iOS SDK中提供了不少API来帮助咱们编写异步代码, 而且咱们在项目中也已经使用过这些工具库, 但可能咱们并无考虑过这些工具库对编写移动应用程序是如此的重要.

咱们经常使用的工具库:

  • NotificationCenter: 通知中心, 能够在任何地方对任何感兴趣的事件发生时执行一段代码, 好比用户更改了屏幕的方向, 或者是让键盘显示或隐藏.
  • Delegate: 容许你定义一个对象表明另外一个对象与另外一个对象协做. 好比在咱们的App委托中, 你定义了一个当新的远程通知到达时应该要作什么, 可是咱们并不知道这段代码在何时执行, 也不知道它要执行多少次.
  • Grand Centeral Dispatch: 帮助咱们执行抽象的工做, 咱们能够在串行队列中安排顺序执行的代码, 或者在具备不一样优先级的不一样队列上运行大量的并发任务.
  • Closures: 建立能够在代码中传递独立代码片断, 这样其余对象就能够决定是否执行它, 执行多少次以及在什么地方执行它.

因为大多数典型代码都是异步执行某些工做的, 并且全部的UI事件本质上都是异步的, 因此不可能假设整个应用程序代码的执行顺序.

毕竟应用程序的代码根据不一样的外部因素, 代码运行的顺序可能彻底不一样, 好比用户的输入, 网络活动或其余的系统事件(除非有一群机器人没日没夜的在测试咱们的应用程序, 这样子咱们就能够方方面面均可以考虑到了)

固然, 并非说编写好的异步代码是不可能的, 毕竟上面所列出来苹果API都是很是先进, 很是专业的, 与其余平台相比, 它们的功能都很是强大.

但问题是, 复杂的异步代码变得很是的难写, 部分缘由也是由于苹果的SDK提供了多种API:

图片

若是咱们单独的使用Delegate, 或者是Closures, NotificationCenter等等, 因为异步API之间并无共同的语言, 这样子咱们阅读和理解代码并对其执行进行推理都是很是困难的.

为告终束这个话题并将讨论放到更大的话题中, 咱们来看看两段不一样的代码: 一段是同步代码和一段异步代码.

同步代码

为数组的每一个元素执行操做, 这是咱们在开发中常常都会遇到的, 它是一个很是简单但很可靠的应用程序逻辑构建块, 由于它保证了两件事:

  • 同步执行
  • 当咱们在数组上迭代时, 集合是不可变的

花点时间想一想这意味着什么, 当咱们迭代一个集合时, 咱们不须要检查全部元素是否存在, 也不须要回滚以防止另外一个现成在集合的开始插入一个元素.

若是你想在for循环的这些方面玩得更多一些, 能够在Playground上试试这个:

var array = [1, 2, 3]
for number in array {
  print(number)
  array = [4, 5, 6]
}
print(array)
复制代码

数组在for循环中是可变的吗? 循环遍历的集合是否会更改? 全部命令的执行顺序是怎么样的? 若是须要, 能够修改号码吗?

异步代码

假设每次迭代都是对按钮点击的反应, 也就是说用户每次点击按钮时, 应用程序都会打印出数组中的下一个元素:

var array = [1, 2, 3]
var currentIndex = 0
// This method is connected in Interface Builder to a button
@IBAction func printNext(_ sender: Any) {
  print(array[currentIndex])
  if currentIndex != array.count - 1 {
    currentIndex += 1
  }
}
复制代码

请与前面的代码相同的上下文中考虑这段代码, 当用户点击按钮时, 会打印出数组的全部元素吗? 答案是不肯定的.

或者, 另外一段代码可能会在继续以后再集合的开头插入一个新元素?

假设只有printNext(_:)才会更改currentIndex, 可是另外一段代码也可能修改currentIndex, 有多是你同事给你在后面补的刀.

讲到这里, 你可能已经意识到编写异步代码的核心问题:

  • 执行工做的顺序
  • 共享可变的数据

幸亏, 这些都是RxSwift的强项!

接下来, 你将开始了解RxSwift是如何工做的, 以及它解决了哪些问题.

异步编程的术语表

RxSwift中的有些术语与异步, 响应式和函数式编程紧密的绑定在一块儿, 若是你先理解如下的基本术语, 就会更加容易理解.

通常来讲, RxSwift试图解决一下的问题:

状态, 可共享的可变状态

状态是比较难定义的, 要理解状态, 能够从一下的实际示例去理解.

当咱们启动电脑的时候, 它能够运行的很好, 可是在咱们使用了几天或者是几周以后, 它可能会表现得奇怪, 有时候还会耍小脾气, 忽然不工做了, 可是电脑的硬件和软件是保持不变的, 一旦咱们重启了电脑以后, 一样的硬件和软件又开始正常工做了.

内存中的数据, 存储在磁盘的数据, 响应用户的输入, 从云服务获取数据后留下的全部追踪, 这些全部的东西都是电脑上的状态.

管理应用程序的状态, 特别是在多个异步组件之间共享状态, 是咱们在本教程中要去学会处理的问题之一.

命令式编程

命令式编程是一种使用语句改变程序状态的编程规范, 就好像咱们逗狗时使用的命令语言同样, "去拿XX", "坐下", "躺下"等等, 使用命令代码告诉应用程序确切的时间和怎么作.

命令式代码与计算机可以理解的代码相似, CPU所作的就是遵循冗长的指令序列, 问题来了, 对于人类来讲, 为复杂的异步应用程序编写命令式代码是很是具备挑战性的, 尤为是涉及到共享可变状态时.

例如, 以iOSViewControllerviewDidAppear(_:)中的代码为例:

override func viewDidAppear(_ animated: Bool) {
  super.viewDidAppear(animated)
  setupUI()
  connectUIControls()
  createDataSource()
  listenForChanges()
}
复制代码

咱们不知道这些方法是作什么的, 它们是否要更新ViewController自己的属性? 让人更加不解的是, 它们的调用顺序是否正确, 若是有人无心中交换了这些方法的调用顺序, 并将更改的代码提交了Pull Request, 那么如今所看到的应用程序行为可能就会有所不一样.

反作用

既然咱们队可变状态和命令式编程有了更多的了解, 那么咱们就能够将这两件事的大多数问题归结为反作用.

反作用用来表示对代码当前范围以外的状态的任何更改. 例如, 参考上面示例中的最后一段代码connectUIControls()可能将某种事情处理程序附加到某些UI组件当中, 这会产生一个反作用, 由于它改变了View的状态, 应用程序在执行connectUIControls()以前以一种方式执行, 以后又以另外一种方式执行.

每当修改存储在磁盘上的数据或者更新屏幕上的UILabel文本时, 都会产生反作用.

反作用自己其实并不算是坏事, 毕竟产生反作用是任何程序的最终目标, 咱们须要在程序执行完成后以某种方式更改世界的状态.

运行一段时间, 什么都不作, 会使应用程序变得很是的无用.

图片

咱们要以一种可控的方式去产生反作用, 须要可以肯定哪些代码片断会致使反作用, 以及哪些代码片断只处理和输出数据.

RxSwift试图经过处理如下几个概念来解决上面列出的问题.

声明式代码

在命令式编程中, 能够随意改变状态, 在函数式编程中, 咱们的目标是最小化引发反作用的代码. 可是咱们没有生活在一个完美的世界里, 那么平衡就在二者之间. RxSwift结合了命令式代码和函数式代码的一些最佳方面.

声明式代码容许咱们定义行为片断, 只要有相关事件, RxSwift就会运行这些行为, 而且提供一个不可变的, 独立的数据块来处理这些行为事件.

经过这种方式, 咱们可使用异步代码, 可是咱们的目标是作出与简单的for循环相同的假设: 咱们正在处理不可变的数据, 而且能够以顺序说的, 肯定性的方式执行代码.

反应系统

反应系统是一个至关抽象的数据, 涵盖了web或iOS应用程序, 这些应用程序大多都具有如下特性:

  • 响应性: 始终保持最新的UI, 表示应用程序最新的状态.
  • 弹性: 每一个行为都是独立定义的, 提供灵活的错误恢复.
  • 灵活性: 代码处理不一样的工做负载, 一般实现一些特性, 如延迟驱动数据的收集, 事件节流和资源共享.
  • 消息驱动: 使用消息通讯来驱动来提升组件的可重用性和隔离性, 解耦类的生命周期和实现.

如今咱们已经很好的理解了RxSwift能够帮助咱们解决什么问题和如何的去解决这些问题, 那么如今能够讨论Rx的构建快以及它们何如协同工做了.

RxSwift基础

响应式变成不是一个新概念, 它已经存在了至关长的时间, 但它的核心概念在十年中有了明显的回归.

在此期间, web应用程序变得更加的复杂, 并面临着管理复杂异步UI的问题, 在服务端, 响应式系统(如上所述)已经成为了必须.

微软的一个团队承担了解决咱们在本章中讨论的异步, 可伸缩, 实时应用程序开发问题的挑战. 他们开发了一个独立于公司核心团队的库, 并在2009年先后提供了一个新的客户端与服务端的框架, 称为.net的响应式扩展Reactive Extensions for .NET(Rx).

.NET3.5版本中是可选的插件, 后来在4.0版本以后称为核心库, 自2012年以来, 它一直都是一个开源的组件, 开源代码容许其余语言和平台从新实现相同的功能, 这使得Rx成为扩平台的标准.

今天有RxJS, RxKotlin, Rx.NET, RxScala, RxSwift等等, 全部这些苦都努力实现基于响应式扩展标准的相同行为和相同表达性的API, 最终, 使用RxSwift建立iOS应用程序的开发人员也能够在Web上自由的与使用了RxJS的其余开发人员讨论应用程序的逻辑.

与最初的Rx同样, RxSwift也能够处理目前为止所涉及的全部概念: 处理可变装, 容许咱们组合事件的序列, 并改进代码的隔离, 可重用性和解耦等体系结构概念.

让咱们重温一下这个定义:

RxSwift找到了传统命令式Cocoa代码和纯粹函数式代码之间的最佳平衡点, 它容许咱们经过使用不可变的代码定义肯定的, 可组合的方式处理异步输入片断来响应事件.

咱们能够经过ReactiveX阅读关于Rx实现家族的更多信息. 这是关于Rx操做符和核心类的文档的中心存储库. 这也多是你第一个注意到Rx电鳗标志的地方.

图片

在本教程中, 咱们将涵盖使用RxSwift开发的基本该你拿, 以及如何在应用程序中使用它们的实际示例.

Rx代码的三个构建快是Observable, OperatorSchedulers, 下面的小节将详细介绍这些内容.

Observables

Observable<T>类提供了Rx的基础代码: 拥有异步产生事件的能力, 能够"装载"不可变类型<T>的通用数据, 它容许其余对象订阅该事件, 或者是values, 而后发出另外一个对象.

Observable<T>类容许一个或多个观察者实时响应任何事件, 并更新应用程序的UI, 或者处理和利用新传入的数据.

ObservableType协议(Observable<T>符合该协议)很是简单. 一个可观察对象只能发射(和观察者能够接收)三种类型的事件:

  • A next event: "carries"(或"next")最新的数据事件, 这是观察者"接收"的方式, 在发出终止事件以前, 能够发出不肯定数量的值.
  • A completed event: 此事件成功终止事件序列. 它意味着Observable对象成功的完成了它的生命周期, 而且不会发出额外的事件.
  • An error event: Observable对象以错误的事件结束, 不会发出额外的事件.

当讨论异步事件随着事件的推移而发出时, 咱们能够在时间轴上可视化一个Observable的整数序列, 以下所示:

图片

一个Observable能够发出三个可能事件的简单契约能够是Rx中的任何事情, 由于它很是的广泛, 咱们能够用它来建立很是复杂的应用逻辑.

因为Observable契约没有对Observable对象或者观察者的本质作出任何的假设, 由于使用事件序列是最终解耦的实践.

咱们永远不须要使用Delegate或者Block来容许类与类之间的通讯:

图片

为了了解一些实际状况, 咱们将研究两种不一样的Observable序列: 有限序列和无限序列.

有序的Observable序列

一些Observable的序列发出零个, 一个或者是多个值, 在稍后的时刻, 要么成功后终止序列, 要么就发生错误后终止序列.

在iOS应用程序中, 考虑从网上下载文件的代码:

  • 首先, 开始下载并开始观察传入的数据.
  • 而后, 当文件的一部分进入时, 咱们将会不断的接收数据块.
  • 若是网络中断, 下载将会中止, 连接将超时并出现错误.
  • 另外, 若是成功的下载了全部文件的数据, 它将成功后终止序列.

该工做流程准确的描述了经典Observable的生命周期, 代码以下:

API.download(file: "http://www...")
  .subscribe(onNext: { data in
    // Append data to temporary file
  },
  onError: { error in
    // Display error to user
  },
  onCompleted: {
    // Use downloaded file
})
复制代码

API.download(file:)返回一个Observable的实例, 该实例在网上传输数据块时发出数据.

咱们能够经过提供onError闭包订阅错误, 在该闭包中, 能够显示error.localizedDescriptionUIAlertController中, 或者执行其余的操做.

最后, 处理一个已完成的事件, 咱们则须要提供一个onCompleted闭包, 在该闭包中, 咱们能够push一个新的UIViewController来显示下载的文件, 或者其余的逻辑处理.

无限的Observable序列

与文件下载活动不一样, 这些活动要么天然的终止, 要么就是强制终止, 有一些序列是无限的, 一般UI事件就是这种无限的Observable序列:

例如, 考虑到咱们须要对应用程序中的改变设备方向时须要做出反应:

  • 咱们将咱们的类做为观察者, 并添加来自NotificationCenterUIDeviceOrientationDidChange的通知.
  • 而后须要提供一个方法回调来处理方向的更改, 它须要从UIDevice获取当前的朝向并对最新的值做出相应的反应.

这一系列的方向变化并无一个天然的终点, 只要有设备, 就可能有一系列的方向变化, 此外, 有序序列其实是无限的, 因此在开始观察它时会有一个初始值.

图片

用户可能历来没有旋转过他们的设备, 但这并不意味着事件序列已经终止了, 它只是没有发出事件而已.

RxSwift中, 咱们能够这样写代码来处理设备的朝向:

UIDevice.rx.orientation
  .subscribe(onNext: { current in
    switch current {
    case .landscape:
      // Re-arrange UI for landscape
    case .portrait:
      // Re-arrange UI for portrait
	} 
})
复制代码

UIDevice.rx.orientation是一个虚构的控件属性, 它生成一个Observable(这个很简单, 咱们将在下一章节中学习到). 咱们订阅它根据当前的方向来更新App UI, 咱们能够直接跳过onErroronCompleted, 由于这些事件永远都不会从Observable对象发出.

操做符(Operators)

ObservableTypeObservable类实现了大量抽象异步工做的离散部分的方法, 这些方法能够组合在一块儿实现复杂的逻辑. 由于它们是高度解耦和可组合的, 因此这些方法一般称做为操做符(Operators).

因为这些操做符主要接受异步的输入, 而且只产生输出而不产生反作用, 因此它们能够很容易的组合在一块儿, 就像拼拼图同样, 而且能够构建更大的画面.

例如: 以简单的数学表达式**(1 + 2) * 3 - 4**为例:

以一种清晰的, 肯定的方式, 咱们能够将操做符*****, (), **+-**按照预约的顺序做为它们输入的数据块, 获取它们输出的结果并继续处理表达式, 直接解析完成为止.

以某种相似的方式, 咱们能够将Rx操做符应用Observable对象发出的事件, 以肯定的处理输入和输出, 知道表达式解析为最终值, 而后咱们就可使用该值来作其余的操做:

下面是关于一个观察方向变化的例子, 调整后咱们就能够看到一些常见的Rx操做符:

UIDevice.rx.orientation
  .filter { value in
    return value != .landscape
  }
.map { _ in
	return "Portrait is the best!"
}
.subscribe(onNext: { string in
  showAlert(text: string)
})
复制代码

每次当UIDevice.rx.orientation生成.landscape.portrait值, Rx将对发出的数据块用对应的操做符进行处理.

图片

首先, filter只容许非.landscape的值经过. 若是设备处于横向模式, 那么订阅的代码则不会被执行, 由于有filter来抑制这些事件.

.portrait值的状况下, map操做符将获取方向的类型转换为一串衣服穿输出——文本"Portrait is the best!"

最后, 使用subscribe进行订阅, 将咱们处理好的字符串, 经过调用一个方法显示在UIAlertController中.

操做符也是能够高度组合的——它们老是将数据做为输入和输出的结果, 所以咱们能够轻松地以许多不一样的方式将它们连接起来, 从而实现比单个操做符多出更多的功能!

在阅读本教程中, 咱们会慢慢了解到更多复杂的操做符, 它们抽象了更复杂的异步代码.

线程调度(Schedulers)

线程调度至关于Rx的分派队列——更加的容易使用.

RxSwift附带了许多预编译的调度器, 涵盖99%的使用场景, 由于RxSwift永远都不但愿须要咱们本身去建立调度器.

事实上, 这个教程里的前半部分中的大多数示例都很是简单, 一般都是处理观察数据和更新UI, 因此在学习了基础知识以前, 咱们不会去研究调度程序.

例如, 但愿能够指定在SerialDispatchQueueScheduler上观察下一个事件, 该调度程序使用Grand Central Dispatch在指定队列串行的运行代码.

ConcurrentDispatchQueueScheduler将同时运行咱们的代码, 而OperationQueueScheduler将容许咱们在指定的操做队列上订阅调度器.

这里说一句谢谢RxSwift, 咱们能够在不一样的调度器调度相同订阅的不一样代码片断, 从而获取最佳的性能.

RxSwift将在订阅(在下面图片的左侧方)和调度程序(在下面图片的右侧方)充当调度器, 将代码块发送到正确的上下文中, 而且容许他们无缝间的处理彼此输出的数据.

图片

要阅读此图, 请按照在不一样的调度称重的顺序(1, 2, 3, ...)跟踪彩色的代码片断, 例如:

  • 蓝色的网络订阅从一段代码(1)开始, 这段代码运行在基于自定义操做队列的调度程序上.
  • 这一块的数据做为下一个工做块(2)的输入, 下一个工做块(2)运行在另外一个调度程序上, 该调度程序位于并发后台的GCD队列上.
  • 最后, 在主线程的调度程序上调度最后一段蓝色的代码块, 将这些处理好的数据用于UI的更新.

这样子解释起来很是的有趣而且很是的方便, 并且咱们也不须要在调度程序上花费太多的精力.

应用程序体系结构

值得一提的是, RxSwift不会以任何的方式改变应用程序的架构, 它主要是处理事件, 异步数据序列和通用通讯.

咱们可使用Rx建立应用程序, 方法能够是实现Apple developer文档中定义的MVC(Model-View-Controller)架构, 也能够选择实现MVP(Model-View-Presenter)或者是MVVM(Model-View-ViewModel).

若是你想的话, RxSwift对于实现你本身得单向数据流架构也很是有用.

值得注意的是, 咱们绝对不须要重新开始写一个项目, 而且使它成为一个响应式应用程序, 能够慢慢的重构迭代现有项目的各个部分, 或者在为应用程序构建新功能时简单的使用RxSwift.

微软的MVVM体系结构是专门为在提供数据绑定的平台上建立事件驱动软件而开发的, RxSwiftMVVM确实能够很是好的结合在一块儿, 在本教程的最后, 咱们会使用RxSwift去实现这种模式.

MVVMRxSwift之因此可以很好的结合在一块儿, 是由于ViewModel容许咱们公开Observable属性, 咱们能够直接绑定到UIViewController的胶水代码中的UIKit控件, 这会让数据模型绑定到UI很是的容易:

图片

本教程全部的其余示例都会以MVC的架构去实现, 以保证代码简单易懂.

RxCocoa

RxSwift是通用的, 而且是与平台无关的Rx规范的实现, 所以它对任何Cocoa或者特定的UIKit的类一无所知.

RxCocoaRxSwift的伙伴库, 包含了帮助咱们开发UIKitCocoa的类, 除了提供一些高级类以外, RxCocoa还向许多UI组件添加了响应式扩展, 这样子咱们就能够订阅各类UI事件.

例如, 很容易使用RxCocoa订阅UISwitch的状态变化, 代码以下:

toggleSwitch.rx.isOn
  .subscribe(onNext: { isOn in
    print(isOn ? "It's ON" : "It's OFF")
  })
复制代码

RxCocoa添加了rx, 将isOn属性(以及其余属性)订阅到UISwitch类, 以即可以将有用的事件订阅为响应式Observable序列.

图片

此外, RxCocoarx的明明空间添加到了UITextField, URLSession, UIViewController等等, 甚至容许咱们在这个命名空间下定义属于咱们本身的响应式扩展, 在这个教程的后面咱们会了解到.

安装RxSwift

因为RxSwift是开源的, 咱们能够经过https://github.com/ReactiveX/RxSwift免费得到.

RxSwift是基于MIT协议下发布的, 健儿颜值, 它容许咱们在现有的基础上将库使用在免费或者是商业软件中, 与其余全部通过麻省理工学院受权的软件同样, 版本声明应该包含在咱们发布的全部应用程序中.

RxSwift存储库中又不少值得探索的地方, 除了RxSwiftRxCocoa库以外, 咱们还能够找到RxTestRxBlocking, 他们将容许咱们为RxSwift代码编写测试.

除了全部优秀的源代码(绝对值得咱们一看), 咱们还会找到Rx.playground, 这里面演示须要交互操做符, 还能够看看RxExample, 在这个Demo中, 它在演示的过程当中实现了许多的概念.

在项目中包含RxSwift/RxCocoa的最简单方法是经过CocoaPodsCarthage, 甚至还可使用Swift Package Manager来管理.

本教程使用的是CocoaPods, 哪怕是你之前没有用过也无所谓, 可是请在看本教程的时候确保使用CocoaPods.

经过CocoaPods安装RxSwift

咱们能够像其余的pod库同样经过CocoaPods安装RxSwift, 正常的Podfile应该是这样子的:

use_frameworks!
target 'MyTargetName' do
  pod 'RxSwift', '~> 4.4'
  pod 'RxCocoa', '~> 4.4'
end
复制代码

固然, 咱们能够只导入RxSwiftRxCocoa, 其余的库若是要使用, 则能够在GitHub里找到.

至于Carthage这里就不作任何的展现了, 有兴趣的朋友能够自行去寻找资料

社区

RxSwift的项目很是的又活力, 不只仅是由于Rx让咱们能够更加简单的建立应用程序, 还由于围绕着这个项目所造成的社区.

RxSwift社区很是友好, 开发, 而且热衷于讨论模式, 常见的技术还有互相帮助.

除了官方所提供的RxSwift库, 咱们还能够在Community找到更多由Rx爱好者所提供的项目.

图片

更多的Rx库和实验就像雨后的蘑菇同样, 咱们能够在RxSwiftCommunity找到

若是想认识许多对RxSwift感兴趣的人, 也能够经过Slack专用的频道: RxSwift for Slack.

这个频道里有几千名用户在相互帮助或讨论RxSwift以及其余配套库的潜在新特性, 还会有关于RxSwift的博客文章, 会议演讲等等.

总结

经过这篇文章, 咱们知道了命令式编程, 函数式编程的一些基本概念, 也初步认识了RxSwift能够给咱们带来什么样的好处, 能够更简单, 更省事的开发咱们想开发的应用程序.

那么接下来就开始学习RxSwift的基本知识吧.

相关文章
相关标签/搜索