|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
视图是仪表盘模型是发动机控制器是控制芯片CoreData---管理数据OBJC刚学的时候觉得CD很高深其实他是最容易用的库之一
甚么是ReactiveCocoa
ReactiveCocoa(其简称为RAC)是由Github开源的一个使用于iOS和OSX开辟的新框架。RAC具有函数式编程和呼应式编程的特征。它次要吸收了.Net的ReactiveExtensions的计划和完成。
ReactiveCocoa试图办理甚么成绩
经由一段工夫的研讨,我以为ReactiveCocoa试图办理以下3个成绩:
- 传统iOS开辟过程当中,形态和形态之间依附过量的成绩
- 传统MVC架构的成绩:Controller对照庞大,可测试性差
- 供应一致的动静传送机制
传统iOS开辟过程当中,形态和形态之间依附过量的成绩
我们在开辟iOS使用时,一个界面元素的形态极可能受多个别的界面元素或背景形态的影响。
比方,在用户帐户的登录界面,一般会有2个输出框(分离输出帐号和暗码)和一个登录按钮。假如我们要到场一个限定前提:当用户输出完帐号和暗码,而且登录的收集哀求还未收回时,断定按钮才能够点击。一般情形下,我们必要监听这两个输出框的形态变更和登录的收集哀求形态,然后修正另外一个控件的enabled形态。
传统的写法以下(该示例代码修正自ReactiveCocoa官网):- 12345678910111213141516171819202122232425262728293031
复制代码- staticvoid*ObservationContext=&ObservationContext;-(void)viewDidLoad{[superviewDidLoad];[LoginManager.sharedManageraddObserver:selfforKeyPath:@"loggingIn"options:NSKeyValueObservingOptionInitialcontext:&ObservationContext];[self.usernameTextFieldaddTarget:selfaction:@selector(updateLogInButton)forControlEvents:UIControlEventEditingChanged];[self.passwordTextFieldaddTarget:selfaction:@selector(updateLogInButton)forControlEvents:UIControlEventEditingChanged];}-(void)updateLogInButton{BOOLtextFieldsNonEmpty=self.usernameTextField.text.length>0&&self.passwordTextField.text.length>0;BOOLreadyToLogIn=!LoginManager.sharedManager.isLoggingIn&&!self.loggedIn;self.logInButton.enabled=textFieldsNonEmpty&&readyToLogIn;}-(void)observeValueForKeyPath:(NSString*)keyPathofObject:(id)objectchange:(NSDictionary*)changecontext:(void*)context{if(context==ObservationContext){[selfupdateLogInButton];}else{[superobserveValueForKeyPath:keyPathofObject:objectchange:changecontext:context];}}
复制代码 RAC经由过程引进旌旗灯号(Signal)的观点,来取代传统iOS开辟中关于控件形态变更反省的代办署理(delegate)形式或target-action形式。由于RAC的旌旗灯号是能够组合(combine)的,以是能够轻松地机关出另外一个新的旌旗灯号出来,然后将按钮的enabled形态与新的旌旗灯号绑定。以下所示:- RAC(self.logInButton,enabled)=[RACSignalcombineLatest:@[self.usernameTextField.rac_textSignal,self.passwordTextField.rac_textSignal,RACObserve(LoginManager.sharedManager,loggingIn),RACObserve(self,loggedIn)]reduce:^(NSString*username,NSString*password,NSNumber*loggingIn,NSNumber*loggedIn){return@(username.length>0&&password.length>0&&!loggingIn.boolValue&&!loggedIn.boolValue);}];
复制代码 能够看到,在引进RAC以后,之前散落在action-target或KVO的回调函数中的判别逻辑被一致到了一同,从而使得登录按钮的enabled形态被加倍明晰地表达了出来。
除组合(combine)以外,RAC的旌旗灯号还撑持链式(chaining)和过滤(filter),以便利将旌旗灯号举行进一步处置。
试图办理MVC框架的成绩
关于传统的Model-View-Controller的框架,Controller很简单变得对照复杂和庞大。因为Controller承当了Model和View之间的桥梁感化,以是Controller经常与对应的View和Model的耦合度十分高,这同时也形成对其做单位测试十分不简单,对iOS工程的单位测试年夜多都只在一些工具类或与界面有关的逻辑类中举行。
RAC的旌旗灯号机制很简单将某一个Model变量的变更与界面联系关系,以是十分简单使用Model-View-ViewModel框架。经由过程引进ViewModel层,然后用RAC将ViewModel与View联系关系,View层的变更能够间接呼应ViewModel层的变更,这使得Controller变得加倍复杂,因为View不再与Model绑定,也增添了View的可重用性。
由于引进了ViewModel层,以是单位测试能够在ViewModel层举行,iOS工程的可测试性也年夜年夜加强了。InfoQ也曾撰文先容过MVVM:《MVVM启发录》。
一致动静传送机制
iOS开辟中有着各类动静传送机制,包含KVO、Notification、delegation、block和target-action体例。各类动静传送机制使得开辟者在做详细选择时感应狐疑,比方在objc.io上就有专门撰文(破船的翻译),先容各类动静传送机制之间的差别性。
RAC将传统的UI控件事务举行了封装,使得以上各类动静传送机制都能够用RAC来完成。示例代码以下:- 123456789101112131415161718192021222324
复制代码- //KVO[RACObserve(self,username)subscribeNext:^(idx){NSLog(@"成员变量username被修正成了:%@",x);}];//target-actionself.button.rac_command=[[RACCommandalloc]initWithSignalBlock:^RACSignal*(idinput){NSLog(@"按钮被点击");return[RACSignalempty];}];//Notification[[[NSNotificationCenterdefaultCenter]rac_addObserverForName:UIKeyboardDidChangeFrameNotificationobject:nil]subscribeNext:^(idx){NSLog(@"键盘Frame改动");}];//Delegate[[selfrac_signalForSelector:@selector(viewWillAppear:)]subscribeNext:^(idx){debugLog(@"viewWillAppear办法被挪用%@",x);}];
复制代码 RAC的RACSignal类也供应了createSignal办法来让用户创立自界说的旌旗灯号,以下代码创立了一个下载指定网站内容的旌旗灯号。- 12345678910111213141516171819
复制代码- -(RACSignal*)urlResults{return[RACSignalcreateSignal:^RACDisposable*(id<RACSubscriber>subscriber){NSError*error;NSString*result=[NSStringstringWithContentsOfURL:[NSURLURLWithString:@"http://www.devtang.com"]encoding:NSUTF8StringEncodingerror:&error];NSLog(@"download");if(!result){[subscribersendError:error];}else{[subscribersendNext:result];[subscribersendCompleted];}return[RACDisposabledisposableWithBlock:^{NSLog(@"cleanup");}];}];}
复制代码 怎样利用ReactiveCocoa
ReactiveCocoa能够在iOS和OSX的使用开辟中利用,关于iOS开辟者,能够将RAC源码下载编译后,利用编译好的libReactiveCocoa-iOS.a文件。
开辟者也能够用CocoaPods来设置方针工程对ReactiveCocoa的依附,只必要编纂Podfile文件,增添以下内容便可:
管理所有设备发生的事件比如屏幕旋转屏幕关闭或者一些其他的程序的控制逻辑也应该写在这里他的初始化函数是-(id)initWithNibName:(NSString*)nibNamebundle:(NSBundle*)nibBundle后面那个NibName是InterfaceBuilder里设计的界面现在IB已经集成到XCode里了 |
|