函數(shù)響應(yīng)式編程的理解:
程序: 接受輸入-經(jīng)過處理-轉(zhuǎn)換為輸出 構(gòu)成一個程序的生命周期. 一個程序的一個頁面可能會接受多次的輸入,具體表現(xiàn)在(點擊事件,鍵盤事件,搖晃事件,網(wǎng)絡(luò)請求事件等等)這些事件被傳入到應(yīng)用程序里面,經(jīng)過程序的混合處理,產(chǎn)生結(jié)果,這就是輸出.
輸出通常會改變應(yīng)用的UI。開關(guān)狀態(tài)變化、列表有了新的元素都是UI變化。也有可能讓磁盤上某個文件產(chǎn)生變化,或者產(chǎn)生一個API請求,這都是應(yīng)用的輸出。
但不像傳統(tǒng)的輸入輸出設(shè)計,應(yīng)用的輸入輸出可以產(chǎn)生很多次。應(yīng)用打開后,不只是一個簡單的 輸入→工作→輸出 就構(gòu)成了一個生命周期。應(yīng)用經(jīng)常有大量的輸入并基于這些輸入產(chǎn)生輸出.
一個簡單的列子 注冊頁面的輸入框和注冊按鈕是否可被點擊:
傳統(tǒng)寫法:

reactivecocoa 寫法:

ReactiveCocoa由兩大主要部分組成:signals(RACSignal) 和sequences(RACSequence)。
signal 和 sequence 都是streams,他們共享很多相同的方法。ReactiveCocoa在功能上做了語義豐富、一致性強的一致性設(shè)計:signal是push驅(qū)動的stream,sequence是pull驅(qū)動的stream。
RACSignal
異步控制或事件驅(qū)動的數(shù)據(jù)源:Cocoa編程中大多數(shù)時候會關(guān)注用戶事件或應(yīng)用狀態(tài)改變產(chǎn)生的響應(yīng)。
鏈?zhǔn)揭詠聿僮?/b>:網(wǎng)絡(luò)請求是最常見的依賴性樣例,前一個對server的請求完成后,下一個請求才能構(gòu)建。
并行獨立動作:獨立的數(shù)據(jù)集要并行處理,隨后還要把他們合并成一個最終結(jié)果。這在Cocoa中很常見,特別是涉及到同步動作時。
Signal會觸發(fā)它們的subscriber三種不同類型的事件:
下一個事件從stream中提供一個新值。不像Cocoa集合,它是完全可用的,甚至一個signal可以包含nil。
錯誤事件會在一個signal結(jié)束之前被標(biāo)示出來這里有一個錯誤。這種事件可能包含一個NSError對象來標(biāo)示什么發(fā)生了錯誤。錯誤必須被特殊處理——錯誤不會被包含在stream的值里面。
完成事件標(biāo)示signal成功結(jié)束,不會再有新的值會被加入到stream當(dāng)中。完成事件也必須被單獨控制——它不會出現(xiàn)在stream的值里面。
一個signal的生命由很多下一個(next)事件和一個錯誤(error)或完成(completed)事件組成(后兩者不同時出現(xiàn))。
RACSequence
簡化集合轉(zhuǎn)換:你會痛苦地發(fā)現(xiàn)Foundation庫中沒有類似map和filter、fold/reduce等高級函數(shù)。
Sequence是一種集合,很像NSArray。但和數(shù)組不同的是,一個sequence里的值默認是延遲加載的(只有需要的時候才加載),這樣的話如果sequence只有一部分被用到,那么這種機制就會提高性能。像Cocoa的集合類型一樣,sequence不接受nil值。
RACSequence允許任意Cocoa集合在統(tǒng)一且顯式地進行操作
http://www.itdecent.cn/p/87ef6720a096?