ReactiveCocoa是github去年開源的一個項目,是在iOS平臺上對FRP的實現。FRP的核心是信號,信號在ReactiveCocoa(如下簡稱RAC)中是經過RACSignal來表示的,信號是數據流,能夠被綁定和傳遞。 能夠把信號想象成水龍頭,只不過裏面不是水,而是玻璃球(value),直徑跟水管的內徑同樣,這樣就能保證玻璃球是依次排列,不會出現並排的狀況(數據都是線性處理的,不會出現併發狀況)。水龍頭的開關默認是關的,除非有了接收方(subscriber),纔會打開。這樣只要有新的玻璃球進來,就會自動傳送給接收方。能夠在水龍頭上加一個過濾嘴(filter),不符合的不讓經過,也能夠加一個改動裝置,把球改變成符合本身的需求(map)。也能夠把多個水龍頭合併成一個新的水龍頭(combineLatest:reduce:),這樣只要其中的一個水龍頭有玻璃球出來,這個新合併的水龍頭就會獲得這個球。
[self.input.rac_textSignal subscribeNext:^(id x){ NSLog(@"%@", x); }];
在這段代碼之後,只要你的TextField中的值有變化。均可以打印出來。實現了KVO的功能卻減小了無數的代碼。體現了綁定和響應。git
在這段代碼的基礎上咱們還能夠進行過濾 , 如下是第二個例子:github
[[self.input.rac_textSignal filter:^BOOL(id value){ NSString*text = value; return text.length > 3; }] subscribeNext:^(id x){ NSLog(@"%@", x); }];
編譯運行,在TextField只能輸入字符,你會發現只有當輸入超過3個字符時纔會有打印輸出。併發
RACSignal的每一個操做都會返回一個RACsignal,這在術語上叫作連貫接口(fluent interface)。這個功能可讓你直接構建管道,而不用每一步都使用本地變量。學習
在上面的代碼中,註釋部分標記了將id隱式轉換爲NSString,這看起來不是很好看。幸運的是,傳入block的值確定是個NSString,因此你能夠直接修改參數類型:code
[[self.input.rac_textSignal filter:^BOOL(NSString*text){ return text.length > 3; }] subscribeNext:^(id x){ NSLog(@"%@", x); }];
第一個例子是簡單的全部變化都會響應到。可是需求可能只須要響應部分狀況。這時候就用filter來過濾。filter的block返回YES的狀況就是須要觸發的狀況。其餘就不返回。blog
這個是用的leezhong的圖接口
驗證每一個所填寫的數值符合標準以後,Button才能點擊。input
RAC(self, self.btn.enabled) = [RACSignal combineLatest:@[self.usernameText.rac_textSignal, self.passwordText.rac_textSignal] reduce:^id (NSString *userName, NSString *password) { return @(userName.length >= 6 && password.length >= 6); }];
這段代碼把usernameText和passwordText的信號綁定在了一塊兒作reduce處理之後, 返回一個BOOL值去跟self.btn.enabled進行綁定it
以上僅僅是ReactiveCocoa最簡單的用法, 本身的理解也不是很深刻, 因此我會一直對ReactiveCocoa投入時間去學習和使用。編譯
最後引用leezhong所說的一句話
RAC統一了對KVO、UI Event、Network request、Async work的處理,由於它們本質上都是值的變化(Values over time)。