ReactiveCocoa 筆記

ReactiveCocoa 是 Github 推出的一個 Objective-C 框架。GitHub 用這個框架推動了 GitHub for Mac 的開發。

響應而非維護狀態

舉例來說,你有一個按鈕,但他會在特定狀況時才可以被按(例如說密碼欄跟使用者名稱欄都不為空白)。一般的做法一種是不斷的去檢查(polling)或者是在每次改變相依的狀態時(例如輸入密碼)都去做這個檢查然後再改變按鈕的狀態。

響應式編程則提供了另一個手段,讓你去『宣告』這個按鈕的狀態該怎麼被決定。

Signal

這是 RAC 的核心概念。你可以使用運算元(mapping, filtering, chaining)來將眾多的訊號組合起來。

下面的例子是 NapCat 最近採用 RAC 解決的一個問題。

[[downloadSignal flattenMap:^RACStream *(NSData* data) {    
        // Save to temparay path
            NSString* tmpFilePath = [code temporaryFilePath];
          [data writeToFile:tmpFilePath atomically:NO];
            // Extract the file
            return [[[ZipfileExtractor alloc] init] extractFileFromPath:tmpFilePath toPath:[[code uniqueDirectoryURL] absoluteString]];
}] subscribeNext:^(NSNumber* progress) {
            [subject sendNext:@([progress doubleValue] / 2.0 + 0.5)];
} error:^(NSError *error) {
            [self showDownloadingError:error];
            [subject sendError:error];
} completed:^{
            [subject sendCompleted];
}];

downloadSignal 背後是真正下載的動作,而要等到下載完成後,我們才能進行解壓縮的動作。傳統的寫法面臨的問題是,這兩個步驟都可能會遇到需要處理錯誤的部分,就會巢層的寫的盤根錯節。但引入 Singal 的概念後,一旦有錯誤就會自動結束這個 Signal ,所以只要寫一遍的 error handling 就好。官網首頁上還有不少有趣的例子應該都可以讓你體會它的威力。

現存整合

這個就是難點所在了,引入這個框架就是引入一整套新的編程習慣。不只要對團隊進行再教育,現有的框架也需要改寫。主要是先前 Networking 太過仰賴 AFNetworking,造成我的卻步,不過有人已經把這個接口補上了,AFNetworking-RACExtensions

除此之外,官方也提供了不少與現存 KVO 或是 delegate based 的方法做整合,例如 RAC 可以直接將物件的屬性綁定到某個 signal,UIActionSheet 等 UIKit Control 都可以拿到有用的 signal

小結

我當然不會吹噓這個框架是什麼神兵利器,不過會持續將這個框架整合到現有專案。當然,這也是小弟初次使用這種編程範疇跟這個框架,主要是拋磚引玉,希望各位中文開發者也可以多多交流相關開發與使用經驗。

相關資源