標籤:
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‘ dopod ‘ReactiveCocoa‘, ‘~> 2.3.1‘end
通過命令儲存 Podfile 檔案後,在 終端(Terminal) 輸入如下命令進行下載配置 ReactiveCocoa 架構:
pod install
然後就會看到熟悉的下載提示:
Analyzing dependenciesDownloading dependenciesInstalling ReactiveCocoa (2.3.1)Generating Pods projectIntegrating client project [!] From now on use `TomRAC.xcworkspace`.
開啟工程後就能夠使用ReactiveCocoa架構了。
現有個空工程,需要跳過配置步驟想先使用的同學可以先進行下載使用。
[iOS] 響應式編程開發-ReactiveCocoa(二)