[iOS] 响应式编程开发-ReactiveCocoa(二)
RAC实现图片下载功能
在实现异步RAC下载图片的过程中,需要注意以下几点:
• 通过 NSURLConnection 对象的 +(RACSignal *)rac_sendAsynchronousRequest:(NSURLRequest*)r 可以创建网络异步下载的信号量对象;
• 在执行完成异步下载过程后,需要通过 [x deliverOn:[RACScheduler mainThreadScheduler]] 操作将方法返回到主线程进行执行;
@implementation ViewController { RACCommand *loginCommand; RACSignal *loginSignal; } - (void)awakeFromNib { //创建网络图片下载的URL对象 NSURL *url = [NSURL URLWithString:@"http://pica.nipic.com/2007-11-09/2007119124513598_2.jpg"]; //创建网络图片请求对象 NSURLRequest *request = [NSURLRequest requestWithURL:url]; //实例化命令操作对象 loginCommand = [[RACCommand alloc] initWithSignalBlock:^(id sender) { //通过NSURLConnection的+方法,创建异步返回信号量 return [NSURLConnection rac_sendAsynchronousRequest:request]; }]; //信号量完成后的插座操作 [loginCommand.executionSignals subscribeNext:^(RACSignal *x) { //将下载完成的图片数据转换成图片对象后,在主线程赋值给imageView属性 [[x deliverOn:[RACScheduler mainThreadScheduler]] subscribeNext:^(RACTuple *tuple) { NSData *imageData = tuple.last; //imageView - UIImageView self.imageView.image = [UIImage imageWithData:imageData]; }]; }]; } - (void)viewDidLoad { [super viewDidLoad]; //指定触发命令操作 //btn - UIButton self.btn.rac_command = loginCommand; } @end
如何使用ReactiveCocoa
目前大量的ios应用程序在开发的过程中,是通过用户响应来改变应用程序状态的。我们在这样处理事件时,代码往往会变得非常复杂,需要用到大量的回调和状态变量来完成回调函数的功能。
其实像 UI回调 、 网络响应 、 KVO通知 等等,会有很多的共同之处,都需要回调函数进行处理功能。
那么RACSingal统一了这些不同的API,方便他们能够组合在一起完成复杂的功能。
我们先看一下下边的代码:
@implementation ViewController { MethodManager *manager; } - (void)awakeFromNib { manager = [MethodManager sharedManager]; } - (void)viewDidLoad { [super viewDidLoad]; [NSNotificationCenter.defaultCenter addObserver:self selector:@selector(loggedOut:) name:@"loggedOut" object:manager]; [self.usernameTextField addTarget:self action:@selector(textDelegate) forControlEvents:UIControlEventEditingChanged]; [self.passwordTextField addTarget:self action:@selector(textDelegate) forControlEvents:UIControlEventEditingChanged]; [self.logInButton addTarget:self action:@selector(didClickLogin:) forControlEvents:UIControlEventTouchUpInside]; } - (void)dealloc { [NSNotificationCenter.defaultCenter removeObserver:self]; } - (void)textDelegate { BOOL textFieldsNonEmpty = self.usernameTextField.text.length > 0 && self.passwordTextField.text.length > 0; BOOL readyToLogIn = !LoginManager.sharedManager.isLoggingIn && !self.loggedIn; self.logInButton.enabled = textFieldsNonEmpty && readyToLogIn; } - (IBAction)didClickLogin:(UIButton *)sender { [manager logInWithUsername:self.usernameTextField.text password:self.passwordTextField.text success:^{ self.loggedIn = YES; } failure:^(NSError *error) { [self presentError:error]; }]; } - (void)loggedOut:(NSNotification *)notification { self.loggedIn = NO; } @end
如果是RAC代码的话,我们就可以使用如下代码:
@implementation ViewController { MethodManager *manager; } - (void)awakeFromNib { manager = [MethodManager sharedManager]; } - (void)viewDidLoad { [super viewDidLoad]; RAC(self.signButton, enabled) = [RACSignal combineLatest:@[ self.password.rac_textSignal, self.confirm.rac_textSignal, RACObserve(manager, signing), RACObserve(self, signing) ] reduce:^(NSString *username, NSString *password, NSNumber *loggingIn, NSNumber *loggedIn) { return @(username.length > 0 && password.length > 0 && !signing.boolValue && !signing.boolValue); }]; [[self.signButton rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(UIButton *sender) { RACSignal *signingSignal = [manager logInWithUsername:self.usernameTextField.text password:self.passwordTextField.text]; [signingSignal subscribeError:^(NSError *error) { [self presentError:error]; } completed:^{ self.signing = YES; }]; }]; RAC(self, signing) = [[NSNotificationCenter.defaultCenter rac_addObserverForName:@"LOSignNotification" object:nil] mapReplace:@NO]; } @end
导入ReactiveCocoa框架
打开 终端(Terminal) 工具。进入到自己的工程目录文件夹下:
haohao:TomRAC lewis$ vi Podfile
其中 TomRAC 是公司项目文件夹名称
创建完成 Podfile 文件后,要在该文件内输入如下内容:
platform :ios, '6.0' source 'https://github.com/CocoaPods/Specs.git' target 'TomRAC' do pod 'ReactiveCocoa', '~> 2.3.1' end
通过命令保存 Podfile 文件后,在 终端(Terminal) 输入如下命令进行下载配置 ReactiveCocoa 框架:
pod install
然后就会看到熟悉的下载提示:
Analyzing dependencies Downloading dependencies Installing ReactiveCocoa (2.3.1) Generating Pods project Integrating client project [!] From now on use `TomRAC.xcworkspace`.
打开工程后就能够使用ReactiveCocoa框架了。
现有个空工程,需要跳过配置步骤想先使用的同学可以先进行下载使用。