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框架了。
現有個空工程,需要跳過配置步驟想先使用的同學可以先進行下載使用。