[iOS] 響應式編程開發-ReactiveCocoa(二)

來源:互聯網
上載者:User

標籤:

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(二)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.