ReactiveCocoa學(xué)習(xí)

1.ReactiveCocoa是什么误趴?
ReactiveCocoa(簡(jiǎn)稱為RAC),是由Github開源的一個(gè)應(yīng)用于iOS和OS開發(fā)的新框架,Cocoa是蘋果整套框架的簡(jiǎn)稱变隔,是一套基于Cocoa的FRP框架即函數(shù)響應(yīng)式響應(yīng)式編程哼转,其優(yōu)點(diǎn)是用隨時(shí)間改變的函數(shù)表示用戶輸入沮峡,這樣就不需要可變狀態(tài)了吮旅。。

2.導(dǎo)入ReactiveCocoa框架
這里使用CocoaPods來(lái)導(dǎo)入
打開終端萍鲸,進(jìn)入工程文件的同級(jí)目錄
新建一個(gè)profile文件或在原來(lái)的該文件上闷叉,輸入以下內(nèi)容并保存
use_frameworks!
pod 'ReactiveCocoa', '~> 2.5'

3.什么是冷信號(hào)與熱信號(hào)
冷熱信號(hào)的概念源于.NET框架Reactive Extensions(RX)中的Hot Observable和Cold Observable,兩者的區(qū)別是:
3.1 Hot Observable是主動(dòng)的脊阴,盡管你并沒(méi)有訂閱事件握侧,但是它會(huì)時(shí)刻推送,就像鼠標(biāo)移動(dòng)嘿期;而Cold Observable是被動(dòng)的品擎,只有當(dāng)你訂閱的時(shí)候,它才會(huì)發(fā)布消息备徐。
3.2 Hot Observable可以有多個(gè)訂閱者萄传,是一對(duì)多,集合可以與訂閱者共享信息蜜猾;而Cold Observable只能一對(duì)一秀菱,當(dāng)有不同的訂閱者,消息是重新完整發(fā)送蹭睡。
這里面的Observables可以理解為RACSignal衍菱。

Snip20150825_3.png

以上簡(jiǎn)單地創(chuàng)建了一個(gè)信號(hào),并且依次發(fā)送@1肩豁,@2脊串,@3作為值。下面分別有兩個(gè)訂閱者在不同的時(shí)間段進(jìn)行了訂閱清钥,運(yùn)行的結(jié)果如下:

2015-08-25 17:14:21.338 MVVM[3083:94636] Signal was create.
2015-08-25 17:14:21.440 MVVM[3083:94636] Subcriber 1 reveive: 1
2015-08-25 17:14:21.441 MVVM[3083:94636] Subcriber 1 reveive: 2
2015-08-25 17:14:21.441 MVVM[3083:94636] Subcriber 1 reveive: 3
2015-08-25 17:14:22.435 MVVM[3083:94636] Subcriber 2 reveive: 1
2015-08-25 17:14:22.436 MVVM[3083:94636] Subcriber 2 reveive: 2
2015-08-25 17:14:22.436 MVVM[3083:94636] Subcriber 2 reveive: 3

例外修改下代碼如下

Snip20150825_2.png

2015-08-25 17:23:46.418 MVVM[3232:100902] Signal was created.
2015-08-25 17:23:48.512 MVVM[3232:100902] Subcriber 1 receive: 2
2015-08-25 17:23:49.625 MVVM[3232:100902] Subcriber 1 receive: 3
2015-08-25 17:23:49.625 MVVM[3232:100902] Subscriber 2 recveive: 3

上面代碼
1.我創(chuàng)建了一個(gè)信號(hào)琼锋,在1秒、2秒循捺、3秒分別發(fā)送1斩例、2、3這三個(gè)值从橘,4秒發(fā)送結(jié)束信號(hào)。
2.對(duì)這個(gè)信號(hào)調(diào)用publish方法得到一個(gè)RACMulticastConnection础钠。
3.讓connection進(jìn)行連接操作恰力。
4.獲得connection的信號(hào)。
5.分別在1.1秒和2.1秒訂閱獲得的信號(hào)旗吁。

首先- [RACSignal publish]踩萎、- [RACMulticastConnection connect]、- [RACMulticastConnection signal]這幾個(gè)操作生成了一個(gè)熱信號(hào)很钓。

冷熱信號(hào)的如下特點(diǎn):
1.熱信號(hào)是主動(dòng)的香府,即使你沒(méi)有訂閱事件董栽,它仍然會(huì)時(shí)刻推送。如第二個(gè)例子企孩,信號(hào)在46秒被創(chuàng)建锭碳,47秒的時(shí)候1這個(gè)值就推送出來(lái)了,但是當(dāng)時(shí)還沒(méi)有訂閱者勿璃。而冷信號(hào)是被動(dòng)的擒抛,只有當(dāng)你訂閱的時(shí)候,它才會(huì)發(fā)送消息补疑。如第一個(gè)例子歧沪。
2.熱信號(hào)可以有多個(gè)訂閱者,是一對(duì)多莲组,信號(hào)可以與訂閱者共享信息诊胞。如第二個(gè)例子,訂閱者1和訂閱者2是共享的锹杈,他們都能在同一時(shí)間接收到3這個(gè)值撵孤。而冷信號(hào)只能一對(duì)一,當(dāng)有不同的訂閱者嬉橙,消息會(huì)重新完整發(fā)送早直。如第一個(gè)例子,我們可以觀察到兩個(gè)訂閱者沒(méi)有聯(lián)系市框,都是基于各自的訂閱時(shí)間開始接收消息的霞扬。

4.為什么要區(qū)分冷熱信號(hào)
我們來(lái)分析副作用與冷熱信號(hào)的關(guān)系。既然iOS編程中少不了副作用枫振,那么RAC在實(shí)際的使用中也不可避免地要接觸副作用喻圃。下面通過(guò)一個(gè)業(yè)務(wù)場(chǎng)景,來(lái)看看冷信號(hào)中副作用的坑:

Snip20150825_4.png
Snip20150825_5.png

如果你去嘗試運(yùn)行這段代碼粪滤,你會(huì)驚奇的發(fā)現(xiàn)斧拍,這個(gè)網(wǎng)絡(luò)請(qǐng)求發(fā)送了3次。沒(méi)錯(cuò)杖小,是3次請(qǐng)求肆汹。我們也可以想象到類似的代碼存在其他副作用的問(wèn)題,重新刷新了3次tableView予权。

下面來(lái)分析昂勉,為什么是3次網(wǎng)絡(luò)請(qǐng)求呢?首先根據(jù)上面的知識(shí)扫腺,可以推斷出名為fetchData信號(hào)是一個(gè)冷信號(hào)岗照。那么這個(gè)信號(hào)在訂閱的時(shí)候就會(huì)執(zhí)行里面的過(guò)程。那這個(gè)信號(hào)是在什么時(shí)候被訂閱了呢?仔細(xì)回看了代碼攒至,我們發(fā)現(xiàn)并沒(méi)有訂閱這個(gè)信號(hào)厚者,只是調(diào)用這個(gè)信號(hào)的flattenMap產(chǎn)生了兩個(gè)新的信號(hào)。

這里有一個(gè)很重要的概念迫吐,就是任何的信號(hào)轉(zhuǎn)換即是對(duì)原有的信號(hào)進(jìn)行訂閱從而產(chǎn)生新的信號(hào)库菲。

導(dǎo)致3次網(wǎng)絡(luò)請(qǐng)求的原因就是flattenMap中會(huì)對(duì)原有的fetchData信號(hào)進(jìn)行訂閱。

由此可以看到渠抹,不熟悉冷熱信號(hào)對(duì)業(yè)務(wù)造成的影響蝙昙。我們可以想象對(duì)用戶流量的影響,對(duì)服務(wù)器負(fù)載的影響梧却,對(duì)統(tǒng)計(jì)的影響奇颠,如果這是一個(gè)點(diǎn)贊的接口,會(huì)不會(huì)造成多次點(diǎn)贊放航?后果不堪設(shè)想啊烈拒。而這些都可以通過(guò)將fetchData轉(zhuǎn)換為熱信號(hào)來(lái)解決。

5.怎么處理冷信號(hào)與熱信號(hào)

待續(xù)广鳍。荆几。。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末赊时,一起剝皮案震驚了整個(gè)濱河市吨铸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌祖秒,老刑警劉巖诞吱,帶你破解...
    沈念sama閱讀 210,978評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異竭缝,居然都是意外死亡房维,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門抬纸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)咙俩,“玉大人,你說(shuō)我怎么就攤上這事湿故“⒊茫” “怎么了?”我有些...
    開封第一講書人閱讀 156,623評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵坛猪,是天一觀的道長(zhǎng)歌焦。 經(jīng)常有香客問(wèn)我,道長(zhǎng)砚哆,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,324評(píng)論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮躁锁,結(jié)果婚禮上纷铣,老公的妹妹穿的比我還像新娘。我一直安慰自己战转,他們只是感情好搜立,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著槐秧,像睡著了一般啄踊。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上刁标,一...
    開封第一講書人閱讀 49,741評(píng)論 1 289
  • 那天颠通,我揣著相機(jī)與錄音,去河邊找鬼膀懈。 笑死顿锰,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的启搂。 我是一名探鬼主播硼控,決...
    沈念sama閱讀 38,892評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼胳赌!你這毒婦竟也來(lái)了牢撼?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,655評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤疑苫,失蹤者是張志新(化名)和其女友劉穎熏版,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體缀匕,經(jīng)...
    沈念sama閱讀 44,104評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡纳决,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了乡小。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片阔加。...
    茶點(diǎn)故事閱讀 38,569評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖满钟,靈堂內(nèi)的尸體忽然破棺而出胜榔,到底是詐尸還是另有隱情,我是刑警寧澤湃番,帶...
    沈念sama閱讀 34,254評(píng)論 4 328
  • 正文 年R本政府宣布夭织,位于F島的核電站,受9級(jí)特大地震影響吠撮,放射性物質(zhì)發(fā)生泄漏尊惰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望弄屡。 院中可真熱鬧题禀,春花似錦、人聲如沸膀捷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)全庸。三九已至秀仲,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間壶笼,已是汗流浹背神僵。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評(píng)論 1 264
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拌消,地道東北人挑豌。 一個(gè)月前我還...
    沈念sama閱讀 46,260評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像墩崩,于是被迫代替她去往敵國(guó)和親氓英。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • 作為一個(gè)iOS開發(fā)者鹦筹,你寫的每一行代碼幾乎都是在相應(yīng)某個(gè)事件铝阐,例如按鈕的點(diǎn)擊,收到網(wǎng)絡(luò)消息铐拐,屬性的變化(通過(guò)KVO...
    jiajia1118閱讀 796評(píng)論 0 2
  • 作為一個(gè)iOS開發(fā)者徘键,你寫的每一行代碼幾乎都是在相應(yīng)某個(gè)事件,例如按鈕的點(diǎn)擊遍蟋,收到網(wǎng)絡(luò)消息吹害,屬性的變化(通過(guò)KVO...
    不作不會(huì)死閱讀 445評(píng)論 0 1
  • 先貼上我看的博客,大部分內(nèi)容來(lái)自以下博客 入門教程 sunnyxx的博客虚青,共四篇 美團(tuán)的四篇博客 一篇關(guān)于repl...
    Auther丶閱讀 3,309評(píng)論 1 40
  • ReactiveCocoa 前言 在 iOS 編程中我們需要處理各種事件,例如響應(yīng)按鈕的點(diǎn)擊,監(jiān)聽鍵盤的輸入,監(jiān)聽...
    aSnail閱讀 910評(píng)論 0 2
  • 一篇關(guān)于RectiveCocoa的總結(jié)文檔 百度搜索了一下RectiveCocoa它呀,都是與MVVM關(guān)聯(lián)在一起。 1...
    毒某人閱讀 477評(píng)論 0 0