Swift-ReactiveCocoa3.0(一)Signal

原创 2015年07月10日 16:19:07

环境:XCode6.3.2、swift1.2

ReactiveCocoa就不作太多介绍了。
MVVM框架思想网上也有很多介绍:http://www.tuicool.com/articles/Ub2MZju

ReactiveCocoa已发展到3.0版本,相对2.x有较大改变,特别加入Swift的支持,所以特此记录下来。

1、信号-Signal
与oc不同,Swift不支持宏定义,所以oc的RAC、RACObserver的创建、绑定信号功能已经不适用,所以使用新的类:Signal、SignalProducer。

  • 初始化:
//创建信号和观察者
let (signal, observer) = Signal<String?, NoError>.pipe()
//创建一个信号,一个观察者(Observer类型后面介绍)

Signal的用法跟OC版的差不多,只是结合了Swift的语法特点,通过重载运算符 |> 全局方法

  • 映射Map:
//转换为一个新值
|> map { text in return (text as String).uppercaseString }  
  • 过滤Filter:
|> filter { text in return count(text as String) > 3 } 
  • 忽略nil值:
|> ignoreNil
  • 指定最多执行次数
|> take(2)  //若为0,则不执行next:,直接completed:
  • 转为数组
|> collect 
  • 跳过指定次数
|> skip(3)  跳过3next:只执行第四次
  • 延迟执行:
|> delay(2, onScheduler: QueueScheduler()) //切换到指定线程 延迟2秒执行next:、completed: 
  • 切换线程:
|> observeOn(UIScheduler()) //将next:、error:、completed:等事件执行在主线程/子线程 
  • 监控事件:
|> observe()    
    //error:调用了sendError
    //completed:调用了completed
    //interrupted:调用了sendInterrupted
    //next:调用了sendNext
  • 通知错误事件:
sendError(observer, NSError(domain: "", code: 404, userInfo: ["result":"Not Found"]))
通知观察者有错误发生
  • 通知值发生改变:
sendNext(observer, "New Value")
注:必须是Signal创建时的第一个类型
  • 通知发生中断:
sendInterrupted(observer)
  • 通知完成:
sendCompleted(observer)
  • 合并完成与错误事件:
|> materialize  //sendError转为sendCompleted
  • 逆materialize:
|> dematerialize //看了源码应该是当sendError时抛错中断程序


2、观察者-Observer
通过源码发现observer是SinkType的子类、从字面上难以理解,暂且当作是一个栈。
查看sendNext:源码

public func sendNext<T, E: ErrorType, S: SinkType where S.Element == Event<T, E>>(var sink: S, value: T) {
    sink.put(.Next(Box(value)))
}

sink就是sendNext(observer, “”)中的observer。
这里向栈中发送一个Event,经过一轮内部处理最终回调到我们的map、filleter、skip、take、observer等方法上。

好了,大概介绍得差不多,还有几个没看懂的 以后再补上。
因为Swift语法的简洁性和源码的复杂性、看源码还是有点吃力,不过使用起来太方便了,这里不得不佩服ReactiveCocoa的作者。


以上个人笔记、转载请出名出处。谢谢!


编写一unix程序,防止僵尸进程的出现.

僵尸进程的避免 ⒈父进程通过wait和waitpid等函数等待子进程结束,这会导致父进程挂起。 ⒉ 如果父进程很忙,那么可以用signal函数为SIGCHLD安装handler,因为子进程结束后,...
  • iicyl
  • iicyl
  • 2017年04月11日 08:42
  • 65

Swift-ReactiveCocoa3.0(二)SignalProducer 2

SignalProducer 的 lift、concat、then用法
  • Reese_developer
  • Reese_developer
  • 2015年07月30日 23:02
  • 1130

Swift-ReactiveCocoa3.0(二)SignalProducer

接者上一篇,这里介绍SignalProducer。因为本人也刚接触ReactiveCocoa,不太明白为什么要有Signal和SignalProducer,但其实区别还是很大的。同时更新会有点慢,辛苦...
  • Reese_developer
  • Reese_developer
  • 2015年08月03日 09:07
  • 1310

signal 各种操作

信号(signal)是一种进程间通信机制,它给应用程序提供一种异步的软件中断,使应用程序有机会接受其他程序活终端发送的命令(即信号)。应用程序收到信号后,有三种处理方式:忽略,默认,或捕捉。进程收到一...
  • zhangboyj
  • zhangboyj
  • 2011年03月02日 17:16
  • 5108

Linux 信号signal(一)

Linux 信号简介
  • zhangxiao93
  • zhangxiao93
  • 2017年06月13日 22:30
  • 177

signal函数详细用法

传智扫地僧课程学习笔记。 信号是在软件层次上对中断的一种模拟,所以通常把它称为是软中断 信号和中断的区别 信号与中断的相似点: (1)采用了相同的异步通信方式; ...
  • qq_18973645
  • qq_18973645
  • 2017年01月23日 17:44
  • 1163

Signal 桌面版自己打包的方法

通过前两天的郭*贵的现身说法,唯一安全的聊天工具就是 Signal 了。那么桌面版只能通过 Chrome 商店安装,但是国内是访问不了的。所以最好自己下载代码安装,只需要准备个 Chrome 浏览器即...
  • dy200811
  • dy200811
  • 2017年06月06日 11:31
  • 528

signal 函数只能接受一次信号? The naughty signal function

The naughty signal function signal 函数的prototype: #include typedef void (*sighandl...
  • u011368821
  • u011368821
  • 2014年03月31日 12:14
  • 2249

C语言中的signal函数

signal是一个系统调用,是一种特殊的中断,当某种特定的“软件中断”发生时,用于调用的程序。中断一般是程序执行中出现的特殊情况,如引用特殊内存中的非法地址, 浮点数被0除。 signal()的原型为...
  • Pwiling
  • Pwiling
  • 2015年08月13日 10:53
  • 4174

深入理解Linux kernel(内核)中的signal函数

在Linux内核代码中,有一个信号处理绑定器函数signal,它到原型定义如下,通过man 2 signal可以查看其原型。#include typedef void (*sighandler_t)(...
  • leisure512
  • leisure512
  • 2010年01月08日 18:08
  • 2959
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Swift-ReactiveCocoa3.0(一)Signal
举报原因:
原因补充:

(最多只允许输入30个字)