使用ReactiveCocoa实现iOS平台响应式编程
http://www.itiger.me/?p=38
ReactiveCocoa和响应式编程在说ReactiveCocoa之前,先要介绍一下FRP(Functional Reactive Programming,响应式编程),在维基百科中有这样一个例子介绍:
而ReactiveCocoa简称RAC,就是基于响应式编程思想的Objective-C实践,它是Github的一个开源项目,你可以在这里找到它。 关于FRP和ReactiveCocoa可以去看leezhong的这篇blog,图文并茂,讲的很好。 ReactiveCocoa框架概览先来看一下leezhong再博文中提到的比喻,让你对有个ReactiveCocoa很好的理解:
下面我来逐一介绍ReactiveCocoa框架的每个组件 Streams Streams表现为RACStream类,可以看做是水管里面流动的一系列玻璃球,它们有顺序的依次通过,在第一个玻璃球没有到达之前,你没法获得第二个玻璃球。
SignalsSignals表现为RACSignal类,就是前面提到水龙头,ReactiveCocoa的核心概念就是Signal,它一般表示未来要到达的值,想象玻璃球一个个从水龙头里出来,只有了接收方(subscriber)才能获取到这些玻璃球(value)。 Signal会发送下面三种事件给它的接受方(subscriber),想象成水龙头有个指示灯来汇报它的工作状态,接受方通过
一个生命周期的Signal可以发送任意多个“next”事件,和一个“error”或者“completed”事件(当然“error”和“completed”只可能出现一种) Subjectssubjects表现为RACSubject类,可以认为是“可变的(mutable)”信号/自定义信号,它是嫁接非RAC代码到Signals世界的桥梁,很有用。嗯。。。 这样讲还是很抽象,举个例子吧:
可以看到 Commandscommand表现为RACCommand类,偷个懒直接举个例子吧,比如一个简单的注册界面:
Sequences sequence表现为RACSequence类,可以简单看做是RAC世界的NSArray,RAC增加了 Schedulersscheduler表现为RACScheduler类,类似于GCD,but schedulers support cancellationbut schedulers support cancellation,and always execute serially. ReactiveCocoa的简单使用实践出真知,下面就举一些简单的例子,一起看看RAC的使用 Subscription 接收
|
[
"A B C D E F G H I"
componentsSeparatedByString
" "
.
rac_sequence
.
signal
;
// 依次输出 A B C D…
letters
subscribeNext
:
^
(
NSString *
x
)
{
NSLog
(
"%@"
,
x
)
;
}
;
|
Injecting effects
注入效果-doNext:
-doError:
-doCompleted:
,看下面注释应该就明白了: