ReactiveCocoa(其簡稱為RAC)是由Github 開源的一個應用於iOS和OS X開發的新架構。RAC具有函 數式編程和響應式編程的特性。它主要吸取了.Net的 Reactive Extensions的設計和實現。本文將詳細 介紹該架構試圖解決什麼問題,以及其用法與特點。
ReactiveCocoa試圖解決什麼問題
經過一段時間的研究,我認為ReactiveCocoa試圖解決以下3個問題:
傳統iOS開發過程中,狀態以及狀態之間依賴過多的問題
傳統MVC架構的問題:Controller比較複雜,可測試性差
提供統一的訊息傳遞機制
傳統iOS開發過程中,狀態以及狀態之間依賴過多的問題
我們在開發iOS應用時,一個介面元素的狀態很可能受多個其它介面元素或後台狀態的影響。
例如,在使用者帳戶的登入介面,通常會有2個輸入框(分別輸入帳號和密碼)和一個登入按鈕。如果 我們要加入一個限制條件:當使用者輸入完帳號和密碼,並且登入的網路請求還未發出時,確定按鈕才可 以點擊。通常情況下,我們需要監聽這兩個輸入框的狀態變化以及登入的網路請求狀態,然後修改另一 個控制項的enabled狀態。
傳統的寫法如下(該範例程式碼修改自ReactiveCocoa官網 ) : https://github.com/ReactiveCocoa/ReactiveCocoa
static void *ObservationContext = &ObservationContext;(void)viewDidLoad { [super viewDidLoad]; [LoginManager.sharedManager addObserver:self forKeyPath:@"loggingIn" options:NSKeyValueObservingOptionInitial context:&ObservationContext]; [self.usernameTextField addTarget:self action:@selector(updateLogInButton) forControlEvents:UIControlEventEditingChanged]; [self.passwordTextField addTarget:self action:@selector(updateLogInButton) forControlEvents:UIControlEventEditingChanged];}- (void)updateLogInButton { BOOL textFieldsNonEmpty = self.usernameTextField.text.length > 0 && self.passwordTextField.text.length > 0; BOOL readyToLogIn = !LoginManager.sharedManager.isLoggingIn && !self.loggedIn; self.logInButton.enabled = textFieldsNonEmpty && readyToLogIn;}- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { if (context == ObservationContext) { [self updateLogInButton]; } else { [super observeValueForKeyPath:keyPath ofObject:object change:change context:context]; }}