ReactiveCocoa入門(一)

ReactiveCocoa的基本使用方法

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)。
相關文章
相關標籤/搜索