函数响应式编程的理解:
程序: 接受输入-经过处理-转换为输出 构成一个程序的生命周期. 一个程序的一个页面可能会接受多次的输入,具体表现在(点击事件,键盘事件,摇晃事件,网络请求事件等等)这些事件被传入到应用程序里面,经过程序的混合处理,产生结果,这就是输出.
输出通常会改变应用的UI。开关状态变化、列表有了新的元素都是UI变化。也有可能让磁盘上某个文件产生变化,或者产生一个API请求,这都是应用的输出。
但不像传统的输入输出设计,应用的输入输出可以产生很多次。应用打开后,不只是一个简单的 输入→工作→输出 就构成了一个生命周期。应用经常有大量的输入并基于这些输入产生输出.
一个简单的列子 注册页面的输入框和注册按钮是否可被点击:
传统写法:
传统范式的样例中,逻辑被放在了很多方法里,零碎地摆放在view controller里,通过到处散布到delegate里的self.createButton.enabled = [self isFormValid];方法在页面的生命周期中被调用。
reactivecocoa 写法:
所有对于判断表单输入是否合法的逻辑都被整合为一串逻辑了。每次不论哪个输入框被修改了,用户的输入都会被reduce成一个布尔值,然后就可以自动来控制注册按钮的可用状态了。
ReactiveCocoa由两大主要部分组成:signals(RACSignal) 和sequences(RACSequence)。
signal 和 sequence 都是streams,他们共享很多相同的方法。ReactiveCocoa在功能上做了语义丰富、一致性强的一致性设计:signal是push驱动的stream,sequence是pull驱动的stream。
RACSignal
异步控制或事件驱动的数据源:Cocoa编程中大多数时候会关注用户事件或应用状态改变产生的响应。
链式以来操作:网络请求是最常见的依赖性样例,前一个对server的请求完成后,下一个请求才能构建。
并行独立动作:独立的数据集要并行处理,随后还要把他们合并成一个最终结果。这在Cocoa中很常见,特别是涉及到同步动作时。
Signal会触发它们的subscriber三种不同类型的事件:
下一个事件从stream中提供一个新值。不像Cocoa集合,它是完全可用的,甚至一个signal可以包含nil。
错误事件会在一个signal结束之前被标示出来这里有一个错误。这种事件可能包含一个NSError对象来标示什么发生了错误。错误必须被特殊处理——错误不会被包含在stream的值里面。
完成事件标示signal成功结束,不会再有新的值会被加入到stream当中。完成事件也必须被单独控制——它不会出现在stream的值里面。
一个signal的生命由很多下一个(next)事件和一个错误(error)或完成(completed)事件组成(后两者不同时出现)。
RACSequence
简化集合转换:你会痛苦地发现Foundation库中没有类似map和filter、fold/reduce等高级函数。
Sequence是一种集合,很像NSArray。但和数组不同的是,一个sequence里的值默认是延迟加载的(只有需要的时候才加载),这样的话如果sequence只有一部分被用到,那么这种机制就会提高性能。像Cocoa的集合类型一样,sequence不接受nil值。
RACSequence允许任意Cocoa集合在统一且显式地进行操作
http://www.jianshu.com/p/87ef6720a096
网友评论