[iOS]响应式编程开发-ReactiveCocoa.docx_第1页
[iOS]响应式编程开发-ReactiveCocoa.docx_第2页
[iOS]响应式编程开发-ReactiveCocoa.docx_第3页
[iOS]响应式编程开发-ReactiveCocoa.docx_第4页
[iOS]响应式编程开发-ReactiveCocoa.docx_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

iOS 响应式编程开发-ReactiveCocoa(一)以下分享自蓝鸥“肖大侠”技术原创,希望让大家能够更多的了解到在iOS开发平台上响应式编程开发-ReactiveCocoa,此文为上篇,后续还会分享下篇。什么是响应式编程响应式编程是一种面向数据流和变化传播的编程范式。这意味着可以在编程语言中很方便地表达静态或动态的数据流,而相关的计算模型会自动将变化的值通过数据流进行传播。例如,在命令式编程环境中,a:=b+c表示将表达式的结果赋给a,而之后改变b或c的值不会影响a。但在响应式编程中,a的值会随着b或c的更新而更新。电子表格程序就是响应式编程的一个例子。单元格可以包含字面值或类似=B1+C1的公式,而包含公式的单元格的值会依据其他单元格的值的变化而变化。响应式编程最初是为了简化交互式用户界面的创建和实时系统动画的绘制而提出来的一种方法,但它本质上是一种通用的编程范式。什么是ReactiveCocoaReactiveCocoa (RAC) 是一个Objective-C语言内实现响应式编程的框架。RAC提供了大量的能够完成发送 values stream 的API。RAC通过使用信号量(RACSignal)来完成获取当前值和未来值的功能,而不像传统的程序开发一样需要声明大量的变量。Josh Abernathy这样解释它: 程序接收输入产生输出。输出就是对输入做了一些事的结果。输入,转换,输出,完成。 输入是应用动作的全部来源。点击、键盘事件、定时器事件、GPS时间、网络请求响应都算是输入。这些事件被传递到应用中,应用将他们以某种方式混合,产生了结果:就是输出。 输出通常会改变应用的UI。开关状态变化、列表有了新的元素都是UI变化。也有可能让磁盘上某个文件产生变化,或者产生一个API请求,这都是应用的输出。 但不像传统的输入输出设计,应用的输入输出可以产生很多次。应用打开后,不只是一个简单的 输入工作输出 就构成了一个生命周期。应用经常有大量的输入并基于这些输入产生输出。基本的使用方法例如,我们目前想要实现一个NSString对象可以一直绑定到最新的时间,即使字符串发生了变化,也不应该是再去使用时间去重新赋值了。听起来特别像Objective-C语言内的KVO特性,但是这并不是具有压倒性优势的那个方法:1- (void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary*)change context:(void*)context;那么我们现在使用RAC框架来实现这个功能1*.h1234/用来标识时间变量property(nonatomic,strong)NSDate*time;/用来标识文字显示区域property(nonatomic,strong)IBOutletUILabel *label;1*.m12345678910111213141516171819/申请注册一个每个1秒将会在主线程执行一次的信号量RACSignal *repeatSignal = RACSignal interval:1 onScheduler:RACScheduler mainThreadScheduler repeat;/为信号量添加执行代码端repeatSignal subscribeNext: (NSDate* time)self.time = time;/申请注册一个时间属性的信号量RACSignal *timeSignal = selfrac_valuesForKeyPath:timeobserver:self;/为信号量添加执行代码端timeSignal subscribeNext:(NSDate* time) NSDateFormatter*formatter = NSDateFormatteralloc init;formatter setDateFormat:HH:mm:ss;self.label.text = formatter stringFromDate:time;RELEASESAFELY(formatter);同样和Objective-C语言内的KVO特性不同的是,RACSignal信号量可以进行过滤设置。以上边的例子的话,我们加一个功能。获取偶数秒的时间那么信号量部分的代码可以写为123456789101112131415161718/申请注册一个时间属性的信号量RACSignal *timeSignal = selfrac_valuesForKeyPath:timeobserver:self;/为信号量添加过滤blocktimeSignal filter:BOOL(NSDate* time) /获取描述的时间NSDateComponents*com = NSCalendarcurrentCalendar components:NSCalendarUnitSecondfromDate:time;returncom.second % 2 = 0; subscribeNext:(NSDate* time) NSDateFormatter*formatter = NSDateFormatteralloc init;formatter setDateFormat:HH:mm:ss;self.label.text = formatter stringFromDate:time;RELEASESAFELY(formatter);信号量还可以用来导出对应的状态。与Objective-C语言KVO特性不同的是,RAC能够为新的值设置其他的属性。那么我们还是举个功能例子在注册用户时,当用户密码与确认密码相同时,在Label中显示1,不相同时,显示0;如图所示传统方式代码12345678910111213141516- (BOOL)isValid returnself.password.text length 0 &self.confirm.text length 0 &self.password.text isEqual:self.confirm.text;#pragma mark - UITextFieldDelegate- (BOOL)textField:(UITextField *)textFieldshouldChangeCharactersInRange:(NSRange)rangereplacementString:(NSString*)stringself.label.text = (self.isValid).description;returnYES;我们发现逻辑被放在了很多方法里,零碎地摆放在view controller里,通过到处散布到delegate里的self.label.text = (self.isValid).description;方法在页面的生命周期中被调用。那么RAC实现方式的代码123456789RACSignal *passworkSignal =self.password.rac_textSignal;RACSignal *confirmSignal =self.confirm.rac_textSignal;RACSignal *combineSignal = RACSignal combineLatest:passworkSignal,confirmSignal reduce:(NSString*password,NSString*confirm);return(password isEqualToString:confirm).description;RAC(self,label.text) = combineSignal;所有对于的输入都整合在了一起。每次不论哪个输入框被修改了,用户的输入都会被reduce成一个字符串的值,然后就可以自动来控制注册按钮的可用状态了。RAC除了能够完成KVO的功能之外,同样可以完成按钮等用户响应的交互功能完成一个点击按钮弹出Alert的功能如图所示传统方式实现的代码1234567891011121314- (void)viewDidLoad superviewDidLoad;/添加触发事件self.btn addTarget:selfaction:selector(didClick) forControlEvents:UIControlEventTouchUpInside;/点击按钮触发的回调方法- (void)didClick/创建弹出窗口UIAlertView *alertView = UIAlertView alloc initWithTitle:蓝鸥message:nildelegate:nilcancelButtonTitle:nilotherButtonTitles:确定,nil;alertView show;RELEASESAFELY(alertView);RAC方式实现的代码如下1234567891011/添加触发信号量self.btn.rac_command = RACCommand alloc initWithSignalBlock:RACSignal *(idinput) /创建弹出窗口UIAlertView *alertView = UIAlertView alloc initWithTitle:蓝鸥message:nildelegate:nilcancelButtonTitle:nilotherButtonTitles:确定,nil;alertView show;RELEASESAFELY(alertView);returnRACSignal empty;通过以上的代码,RACSignal信号量具有如下功能 异步控制或事件驱动的数据源:Cocoa编程中大多数时候会关注用户事件或应用状态改变产生的响应。 链式以来操作:网络请求是最常见的依赖性样例,前一个对server的请求完成后,下一个请求才能构建。 并行独立动作:独立的数据集要并行处理,随后还要把他们合并成一个最终结果。这在Cocoa中很常见,特别是涉及到同步动作时。RACSignal会触发它们的subscriber三种不同类型的事件: 下一个事件从stream中提供一个新值。不像Cocoa集合,它是完全可用的,甚至一个signal可以包含nil。 错误事件会在一个signal结束之前被标示出来这里有一个错误。这种事件可能包含一个NSError对象来标示什么发生了错误。错误必须被特殊处理错误不会被包含在stream的值里面。 完成事件标示signal成功结束,不会再有新的值会被加入到stream当中。完成事件也必须被单独控制它不会出现在stream的值里面。一个RACSignal信号量的生命周期由很多下一个(next)事件和一个错误(error)或完成(completed)事件组成(后两者不同时出现)。总结对比 RAC 与 KVOKey-Value Observing是Cocoa所有魔法的核心,它被广泛应用在ReactiveCocoa对于属性变化的影响动作中。然而KVO用起来即不简单也不开心:它的API有很多过度设计的参数,以及缺乏方便的block方式调用。RAC 与 BindingsBindings也是黑魔法。虽然对OS X控制的要点就是Bindings,但是它的意义在近年来越来越没那么重要了,因为焦点已经移动到了iOS和UIKit这些Bindings不支持的东西身上。Bindings替代了大量的模版胶水代码,允许在Interface Builder中完成编码,但严格上说还是比较有局限性的,并且_无法_debug。RAC提供了一种简洁易懂、扩展性强的以代码为基础的API来运行在iOS上,目标就是取代所有在OS X能用Bindings实现的神奇功能。Objective-C在C的核心上吸收了Smalltalk的思想建立而成,但哲学理念上已经超越了它原本来源的血统。protocol是对C+多重继承的拒绝,顺应抽象数据的类型范式是对JavaInterface的吸收。Objective-C 2.0引入了property / synthesize则灵感来自C#的get; set;方法对getter和setter的速记(就语法上来说,这也是NeXTSETP强硬路线坚持者经常辩论的一点)。Block给这门语言带来了函数式编程的好处,可以使用Grand Central Dispatch来自Fortran / C / C+ standa

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论