最近项目不多,所以就研究了一下RxSwift和RAS,RAC以前项目中用过了,在这里我就先简单的介绍一下什么是RAS。
总述:
在RAC 5.0这个版本,有了很大的改动,API已经重新命名。在和Swift相关的部分被抽调出来搞成了一个新的框架:ReactiveSwift,可见苹果爸爸对小儿子的喜爱,要大力推广swift了,而不仅仅是用于苹果开发中。

改动部分:
1. RACSignal 和 SignalProducer、 Signal
2. RACCommand 和 Action
3. RACScheduler 和 SchedulerType
4. RACDisposable 和 Disposable

简介:
首先我们用cocoapod导入 pod 'ReactiveSwift'
然后再项目里导入头文件
import Result
import ReactiveSwift

如果你只导入了 ReactiveSwift而没有导入Result,那你打NoError就会报错,因为NoError 依赖于 Result

主要类型
1.事件(Events)
一个事件,被表示为一个 【Event】 类型,它表示一些事情发生了。在 ReactiveSwift中, 事件是通讯的核心。一个事件可能表示一个按钮被按下了、从 API中接收到了一条信息或是一次长时间操作的完成。在任何情况下,有一定意义的事情产生了事件,并通过 【信号】 发送它们给了 [观察者]。
Event
 是一个枚举值,它可以表示为一个 值事件(value) 或者 三个终止操作的任意一个:
a. 值事件(value)可以从来源处提供一个值。
b. 失败事件表示在信号正常结束之前发生了错误。该事件被 ErrorType类型所参数化,这个类型表明事件允许出现失败。但是如果失败是不被允许的,事件将提供 NoError类型来阻止失败。
c. 完成事件表明信号成功地结束了,并且源处(source)不在发送其他任何值了。
d. 中止事件意味着操作可能成功也可能没有成功。

2. 信号(Signals)
一个信号,被表示为一个 [Signal] 类型,是可以观察的 事件 的一组序列。
信号通常被用来表示正在进行的 事件流(event streams),比如通知、用户输入等等。随着工作的进行和数据被接受,事件基于信号被发送,信号能把事件推送给任何的观察者。
所有的观察者能同时看到事件。
用户如果想获取一个事件,就必须观察一个信号。观察一个信号不会造成任何的副作用。换言之,信号完全是 生产者驱动的(producer-driven)和 基于推送的(push-based),并且消费者(观察者)在它们的生命周期中不会有任何影响。在观察信号的时候,用户只能用它们(事件)在信号中被发送的顺序相同的序列来评估它们。我们不能随机的访问信号的值。
信号可以通过应用原语[primitives]来控制它们,比如 filter、map和 reduce都是可以操作一个信号的典型原语。值得注意的是,原语操作仅能对 值事件 进行操作。
在一个信号的生命周期中,它可能有无数的 值事件,并且会以一个终止事件而结束(失败事件、完成事件、中止事件的任意一个)。终止事件不能被包含在信号的值中,它们必须被单独处理。

3. 管道(Pipes)

一个管道,是被 Signal.pipe() 创建的,是一个能被手动控制的信号。

这个方法返回一个信号和观察者。这个信号能够通过发送事件给观察者的方式被控制。这对于连接 非RAC 的代码是非常有用的。

举个栗子,比如在 block 回调函数中处理应用程序逻辑,这些块能简单地向观察者发送事件。同时,题目也可以返回信号,并隐藏回调的实现细节。

4. 信号发生器(Signal Producers)
一个信号发生器,可以被表示为一个 [SignalProducer]类型,它能创建信号,并且会产生副作用。
它们能被用来表示一些操作或者任务,比如网络请求,在每次调用 start()时都将创建一个新的基本操作,并允许调用者去观察结果。startWithSignal()变型可以访问所产生的信号,如果需要的话,允许它被观察多次。
因为 start() 的行为,由相同发生器创建的信号可能会有不同序列或版本的事件,也许流也是完全不同。与普通的信号不同,在增加一个观察者之前,它不会开始工作(不会产生事件),而且每增加一个额外的观察者就会重新工作一遍。
开始一个信号发生器会返回一个 [disposable],disposable被用于中止/关闭与产生的信号相关的工作。
就像和信号一样,信号发生器也能通过原语(primitives)被控制,比如 map、filter等等。每一个信号原语都能使用 lift方法去操作信号产生器。此外,这里还有可以控制 when和 how的额外原语,比如 times。

5. 观察者(Observers)
一个观察者可以是任意东西,只要它正在等待或者即将等待信号中的事件。在 RAC中,一个观察者被表示成一个能接收 [Event]的 [Observer]。
观察者是通过使用基于闭包的 Signal.observe或者是 SignalProducer.start方法隐式创建的。

6. 动作(Actions)
一个动作,被表示为 [Action] 类型。当动作在执行的时候,它可能产生0个或者多个输出,也可能出现失败。
动作对于在用户交互中执行有副作用的工作时非常有用,比如按下一个按钮。动作也会基于一个 [属性] 变得自动不可用,这种不可用状态能够在 UI中通过禁用某些操作的方式被表示出来。

7. 属性(Properties)
一个属性,被表示为一个 [PropertyProtocol] 类型。它能存储一个值,并能通知观察者关于这个值得将来的变更。
一个属性的当前值可能被包含在这个值的 getter里面。产生器 getter 会返回一个 [信号产生器] ,这个信号产生器会发送属性的当前值,这个值会随着时间的推移而变化。 信号 getter
 不仅仅会发送初始化值,也会随着时间发送所有的改变。
<~ 操作可以被用来以用不同的方式绑定属性。在任何情况下,目标都一定会成为绑定目标,它被表示为 [BingingTargetProtocol]。所有可变的属性类型,都被表示为 [MutablePropertyProtocol],是内在的绑定目标。
property <~ signal: 将一个信号绑定在一个属性身上,更新这个属性值的时候,信号会发送出这个属性的最新值。
property <~ producer: 启动一个给定的信号产生器,并将属性的值绑定到信号发送的最新值上。
property <~ otherProperty: 将一个属性绑定在另一个属性身上,所以一旦源属性的值更新了,目标属性的值也会随之更新。
属性提供了大量的事务操作,比如 map、combineLatest或者是 zip,这些操作与信号和信号产生器中的相似。

8. Disposables
一个 Disposable,会被表示成 [Disposable] 协议,是一个内存管理和取消的机制。当启动一个信号产生器的时候,会返回一个 disposable。disposable能取消已启动的工作(比如后台处理,网络请求等),清除所有临时资源,然后用创建的特定信号来发送一个最终的中止事件。观察一个信号也会返回一个 disposable。处理它将会阻止观察者接受来自信号的未来的事件,但它不会对信号本身有任何影响。

9. 调度器(Schedulers)
一个调度器,会被表示成一个 [SchedulerProtocol]协议,它是一个串行的可执行队列,这些队列被用于执行工作或交付(传递)结果。信号和信号产生器能被命令在特定的调度器上传递程序。信号产生器还能被用来在特定的调度器上开始它们的工作。调度器与 Grand Central Dispatch队列相似,但是调度器支持取消操作(通过 [disposables]),并且始终按串行方式去执行。[ImmediateScheduler
] 是一个例外,该调度器不提供同步执行。这能帮助避免死锁,并且鼓励用信号和信号产生器的原语操作去代替闭包。
调度器和 NSOperationQueue也有一定的相似,但是调度器不允许任务被重新安排或者依赖另外一个任务。

主要用法:
1.信号的创建

不多说了直接上代码

咯咯

下面是打印的结果

接下来我们创建一个热信号,看看是什么结果,what?你说你不知道什么是热信号,什么是冷信号。好吧

热信号是主动的,即使你没有订阅事件,它仍然会时刻推送。而冷信号是被动的,只有当你订阅的时候,它才会发送消息。
热信号可以有多个订阅者,是一对多,信号可以与订阅者共享信息。而冷信号只能一对一,当有不同的订阅者,消息会从新完整发送。

我们来看一下热信号吧,还是废话不多说,代码见真知

2.

ReactiveSwift框架的更多相关文章

  1. ReactiveSwift源码解析(一) Event与Observer代码实现

    ReactiveCocoa这个框架是做什么用的本篇博客就不做过多赘述了,什么是"响应式编程"也不多聊了,自行Google吧.本篇博客的主题是解析ReactiveCocoa框架中的核 ...

  2. ReactiveSwift源码解析(七) Signal的CombineLatest的代码实现

    本篇博客我们就来聊一下combineLatest()的使用以及具体的实现方式.在之前的<iOS开发之ReactiveCocoa下的MVVM>的博客中我们已经聊过combineLatest( ...

  3. ReactiveSwift源码解析(八) SignalProducer的代码的基本实现

    在前面几篇博客中我们详细的聊了ReactiveSwift中的Bag.Event.Observer以及Signal的使用方式和代码实现.那么在接下来的这几篇博客中,我们就依附于之前博客的基础上来聊一聊S ...

  4. ReactiveSwift源码解析(九) SignalProducerProtocol延展中的Start、Lift系列方法的代码实现

    上篇博客我们聊完SignalProducer结构体的基本实现后,我们接下来就聊一下SignalProducerProtocol延展中的start和lift系列方法.SignalProducer结构体的 ...

  5. ReactiveSwift源码解析(十) Lifetime代码实现

    为了之后博客的进行,本篇博客我们就来聊一下ReactiveSwift框架中的Lifetime类的具体实现.从Lifetime这个名字中我们就这道,就是生命周期.在ReactiveSwift中使用Lif ...

  6. ReactiveSwift源码解析(十一) Atomic的代码实现以及其中的Defer延迟、Posix互斥锁、递归锁

    本篇博客我们来聊一下ReactiveSwift中的原子性操作,在此内容上我们简单的聊一下Posix互斥锁以及递归锁的概念以及使用场景.然后再聊一下Atomic的代码实现.Atomic主要负责多线程下的 ...

  7. ReactiveSwift源码解析(十二) MutableProperty基本代码实现

    前两篇博客我们分别聊了ReactiveSwift框架中的负责标记对象的生命周期的类Lifetime以及负责原子性操作的Atomic类的具体代码实现.前两篇博客之所以聊Lifetime以及Atomic的 ...

  8. ReactiveSwift源码解析(六) SignalProtocol的take(first)与collect()延展实现

    上篇博客我们聊了observe().map().filter()延展函数的具体实现方式以及使用方式.我们在之前的博客中已经聊过,Signal的主要功能是位于SignalProtocol的协议延展中的, ...

  9. ReactiveSwift源码解析(五) SignalProtocol的observe()、Map、Filter延展实现

    上篇博客我们对Signal的基本实现以及Signal的面向协议扩展进行了介绍, 详细内容请移步于<Signal中的静态属性静态方法以及面向协议扩展>.并且聊了Signal的所有的g功能扩展 ...

随机推荐

  1. Linux下的文件目录结构详解

    Linux下的文件目录结构详解 / Linux文件系统的上层根目录 /bin 存放用户可执行的程序 /boot 操作系统启动时所需要的文件 /dev 接口设备文件目录,例如:had表示硬盘 /etc ...

  2. HDU-1994-利息计算

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=1994 水题 题目分析 就是两种储存方式,输出所得本金加利息 代码 #include<stdio. ...

  3. 查找子字符串----KMP算法深入剖析

    假设主串:a b a b c a b c a c b a b      子串:a b c a c 1.一般匹配算法 逐个字符的比较,匹配过程如下: 第一趟匹配 a b a b c a b c a c ...

  4. 解析STL中典型的内存分配

    1 vector 在C++中使用vector应该是非常频繁的,但是你是否知道vector在计算内存分配是如何么? 在c++中vector是非常类似数组,但是他比数组更加灵活,这就表现在他的大小是可以自 ...

  5. 把记事本文件固定在Win8的开始屏幕

    1.创建该文件的桌面快捷方式: 2.将快捷方式拷贝至开始菜单目录,在开始屏幕的查看全部中可以看见该文件快捷: 3.在查看全部中右键点击该快捷,选择固定在开始屏幕:

  6. Web项目或WCF发布IIS后,如何通过VS2010调试

    在做项目的时候,例如WCF服务一般都会将WCF服务承载于控制台应用程序,或者WinForm窗体应用程序,因为这样可以直接在服务代码上打断点,然后就可以调试了.但是项目已经发布了,当然这里我用的本机进行 ...

  7. Service介绍(MediaPlayer应用)

    一.Service介绍 Service类似于Windows中的服务,没有界面,只是在后台运行:而服务不能自己运行,而是需要调用Context.startService(Intent intent);或 ...

  8. Java NIO------基础理论之缓存区

    1.概述:NIO我的理解就是 New IO,是API1.4里提供的新的API,为所有的原始类型做缓存支持. NIO主要的核心组成部分: Buffer(缓存) Channels(通道) Selector ...

  9. DTLS 技术要点解析

    一.DTLS DTLS 是指 Datagram Transport Level Security,即数据报安全传输协议: 其提供了UDP 传输场景下的安全解决方案,能防止消息被窃听.篡改.身份冒充等问 ...

  10. Array数组常用的5个方法

    es6 时代来临了,不知道es5 你熟知了吗? 在此介绍一个我常用到的5个方法,万恶的ie9一下并不支持,需要做兼容慎用 indexOf indexOf()方法返回在该数组中第一个找到的元素位置,如果 ...