欢迎来到天天文库
浏览记录
ID:51496846
大小:184.97 KB
页数:5页
时间:2020-03-25
《ReactiveCocoa函数式响应编程简介一.pdf》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、ReactiveCocoa函数响应式编程简介1.简介ReactiveCocoa(其简称为RAC)是函数响应式编程框架。RAC具有函数式编程和响应式编程的特性。它主要吸取了.Net的ReactiveExtensions的设计和实现。•函数式编程(FunctionalProgramming)函数式编程也可以写N篇,它是完全不同于OO的编程模式,这里主要讲一下这个框架使用到的函数式思想。(1)高阶函数:在函数式编程中,把函数当参数来回传递,而这个,说成术语,我们把他叫做高阶函数。在oc中,blocks是被广泛使用的参数传递,它实际上是匿名函数。高阶函数调用过程有点像linux命令里
2、的pipeline(管道),一个命令调用后的输出当作另一个命令输入,多个命令之间可以串起来操作。来个例子:RACSequence*numbers=[@"123456789"componentsSeparatedByString:@""].rac_sequence;//Contains:22446688RACSequence*doubleNumber=[[numbersfilter:^BOOL(NSString*value){return(value.intValue%2)==0;}]map:^id(idvalue){return[valuestringByAppendingSt
3、ring:value];}];上面的例子是数组里的值先进行过滤,得到偶数,然后再将每个值进行stringByAppendingString,最终输出22446688.(2)惰性(或延迟)求值:Sequences对象等,只有当被使用到时,才会对其求值。关于函数编程,有兴趣的大家可以研究下haskell或者clojure,不过目前好多语言都在借用函数式的思想。•响应式编程(FunctionalReactiveProgramming:FRP)响应式编程是一种和事件流有关的编程模式,关注导致状态值改变的行为事件,一系列事件组成了事件流。一系列事件是导致属性值发生变化的原因。FRP非常
4、类似于设计模式里的观察者模式。响应式编程是一种针对数据流和变化传递的编程模式,其执行引擎可以自动的在数据流之间传递数据的变化。比如说,在一种命令式编程语言中,a:=b+c表示a是b+c表达式的值,但是在RP语言中,它可能意味着一个动态的数据流关系:当c或者b的值发生变化时,a的值自动的发生变化。RP已经被证实是一种最有效的处理交互式用户界面、实时模式下的动画的开发模式,但本质上是一种基本的编程模式。现在最为热门的JavaFX脚本语言中,引入的bind就是RP的一个概念实现。响应式编程其关键点包括:(1)输入被视为"行为",或者说一个随时间而变化的事件流(2)连续的、随时间而变
5、化的值(3)按时间排序的离散事件序列FRP与普通的函数式编程相似,但是每个函数可以接收一个输入值的流,如果其中,一个新的输入值到达的话,这个函数将根据最新的输入值重新计算,并且产生一个新的输出。这是一种”数据流"编程模式。2.为什么我们要用它(1)开发过程中,状态以及状态之间依赖过多,RAC更加有效率地处理事件流,而无需显式去管理状态。在OO或者过程式编程中,状态变化是最难跟踪,最头痛的事。这个也是最重要的一点。(2)减少变量的使用,由于它跟踪状态和值的变化,因此不需要再申明变量不断地观察状态和更新值。(3)提供统一的消息传递机制,将oc中的通知,action,KVO以及其它
6、所有UIControl事件的变化都进行监控,当变化发生时,就会传递事件和值。(4)当值随着事件变换时,可以使用map,filter,reduce等函数便利地对值进行变换操作。3.何时使用(1)处理异步或者事件驱动的数据变化staticvoid*ObservationContext=&ObservationContext;-(void)viewDidLoad{[superviewDidLoad];[LoginManager.sharedManageraddObserver:selfforKeyPath:@"loggingIn"options:NSKeyValueObserving
7、OptionInitialcontext:&ObservationContext];[NSNotificationCenter.defaultCenteraddObserver:selfselector:@selector(loggedOut:)name:UserDidLogOutNotificationobject:LoginManager.sharedManager];[self.usernameTextFieldaddTarget:selfaction:@selector(updateLogInBut
此文档下载收益归作者所有