RAC實(shí)踐和注意事項(xiàng)

RAC:包括信號(hào)源、訂閱者、調(diào)度器俭正、清潔工

信號(hào)源:

RACSignal,代表未來(lái)將會(huì)被傳送的值适瓦,他是一種push-driven流竿开,RACSignal可以向訂閱者發(fā)送三種不同類型的值:sendNext(正常信號(hào))、error(錯(cuò)誤)玻熙、completed(信號(hào)已經(jīng)發(fā)送結(jié)束否彩,不會(huì)再傳給訂閱者);

信號(hào)的發(fā)送都是通過(guò)-subscribe:這個(gè)方法來(lái)實(shí)現(xiàn)的嗦随,他也是信號(hào)和訂閱者的唯一橋梁列荔。

RACSubject,代表可以手動(dòng)控制的信號(hào),可以看做他是RACSinal的可變版本(類似數(shù)據(jù)和可變數(shù)據(jù))枚尼,因?yàn)樗^承RACSinal所以可以當(dāng)做信號(hào)肌毅,但它又實(shí)現(xiàn)了RACSubscriber協(xié)議,所以他還可以作為訂閱者訂閱其他信號(hào)姑原。(它太靈活悬而,所以正常情況下我們不用他,一般用它的雙性性來(lái)處理 網(wǎng)絡(luò)或其他 fail(錯(cuò)誤邏輯))

充當(dāng)兩種角色實(shí)例:

RACSubject訂閱了RACSignal,又被訂閱者1锭汛、2笨奠、3訂閱
統(tǒng)一處理錯(cuò)誤邏輯實(shí)例


RACSequence:代表一個(gè)不可變的序列(和鏈表一樣結(jié)構(gòu)一樣),它不可以直接被訂閱唤殴,但它可以RACSingal隨意的轉(zhuǎn)換般婆。他主要是用來(lái)處理OC中集合的,例如(遍歷等)循環(huán)數(shù)組等朵逝。

注意:RACSequence中包含的值在默認(rèn)情況下是懶計(jì)算的蔚袍,即只有在真正用到的時(shí)候才會(huì)被計(jì)算,并且只會(huì)計(jì)算一次,如果我們只用到了一個(gè)RACSequence中的部分值的時(shí)候啤咽,它就在不知不覺(jué)中提高了我們應(yīng)用的性能晋辆,(所以我們?cè)谑褂脮r(shí),要先看下我們需要的數(shù)據(jù)和后臺(tái)返回給我們的數(shù)據(jù)宇整,在去看是直接在獲取數(shù)據(jù)時(shí)轉(zhuǎn)換模型瓶佳,還是用的使用轉(zhuǎn)換模型)【性能優(yōu)化問(wèn)題】

處理集合實(shí)例

訂閱者:所有實(shí)現(xiàn)RACSubscriber的類都可以作為訂閱者

注意:一個(gè)訂閱者可以訂閱多個(gè)信號(hào)源的,而且他也可以隨時(shí)取消任意一個(gè)訂閱鳞青;

信號(hào)是可以轉(zhuǎn)成訂閱者的霸饲,只要遵守RACSubscriber協(xié)議就可以。

調(diào)度器:

扮演著調(diào)度器的角色臂拓,本質(zhì)上厚脉,它就是用GCD的串行隊(duì)列來(lái)實(shí)現(xiàn)的,并且支持取消操作

取消請(qǐng)求的例子

清潔工:

垃圾回收胶惰,這個(gè)是自動(dòng)回收的器仗,一般在信號(hào)訂閱完成會(huì)自發(fā)進(jìn)行的。


特殊的一個(gè)存在:事件控制器

RACCommand類用于表示事件的執(zhí)行童番,一般來(lái)說(shuō)是在UI上的某些動(dòng)作來(lái)觸發(fā)這些事件精钮,比如點(diǎn)擊一個(gè)按鈕。RACCommand的實(shí)例能夠決定是否可以被執(zhí)行剃斧,這個(gè)特性能反應(yīng)在UI上轨香,而且它能確保在其不可用時(shí)不會(huì)被執(zhí)行。通常幼东,當(dāng)一個(gè)命令可以執(zhí)行時(shí)臂容,會(huì)將它的屬性allowsConcurrentExecution設(shè)置為它的默認(rèn)值:NO,從而確保在這個(gè)命令已經(jīng)正在執(zhí)行的時(shí)候根蟹, 不會(huì)同時(shí)再執(zhí)行新的操作脓杉。命令執(zhí)行的返回值是一個(gè)RACSignal,因此我們能對(duì)該返回值進(jìn)行next:简逮,completed或error:球散,這在下文會(huì)有所展示。

RACCommand的基本使用

1.executionSignals:需要執(zhí)行的block成功的時(shí)候返回的信號(hào)散庶,他是在主線程執(zhí)行的蕉堰。

2.executing:判斷當(dāng)前的block是否在執(zhí)行,執(zhí)行完之后會(huì)返回@(NO).

3.enabled:當(dāng)前命令是否enabled悲龟,默認(rèn)是no屋讶,他也可以根據(jù)enableSignal來(lái)設(shè)置或者allowsConcurrentExecution設(shè)置為NO的時(shí)候(command已經(jīng)開(kāi)始執(zhí)行)4.errors:執(zhí)行command的時(shí)候獲取的error都會(huì)通過(guò)這個(gè)信號(hào)發(fā)送5.allowsConcurrentExecution:是否允許并發(fā)執(zhí)行command,默認(rèn)是NO须教。6.initWithSignalBlock:(RACSignal * (^)(id input))signalBlock:初始化RACCommand皿渗,參數(shù)為返回一個(gè)信號(hào)的block,即block返回的是executionSignals

7.- (id)initWithEnabled:(RACSignal *)enabledSignal signalBlock:(RACSignal * (^)(id input))signalBlock:第一個(gè)參數(shù)設(shè)置當(dāng)前command是否可用,第二個(gè)是執(zhí)行的block乐疆。enableed默認(rèn)是yes划乖,所以第二個(gè)參數(shù)也可以為nil。

8.execute:(id)input:調(diào)用command诀拭,input為executionSignals的訂閱者發(fā)送的值


--------------------------完美分割線-------------------------------------------

RAC的三個(gè)作用:

1、數(shù)據(jù)綁定:這個(gè)特別是在cell賦值操作時(shí)煤蚌,我們平常是直接懶加載賦值耕挨,有了RAC我們可以在聲明對(duì)象時(shí)就可以直接進(jìn)行數(shù)據(jù)綁定。

2尉桩、函數(shù)式編程:(利用block嵌套block筒占,所有的操作都在一些列的操作中完成)

3、響應(yīng)式編程:幾乎把ios中的所有響應(yīng)監(jiān)聽(tīng)都統(tǒng)一化蜘犁,耦合性非常低翰苫,監(jiān)聽(tīng)的事情和相應(yīng)的事情都可以在一起處理,不在需要相互的跳轉(zhuǎn)这橙。

其他方式也可以是實(shí)現(xiàn)MVVM奏窑,為什么要用這個(gè)方式:

1、模型轉(zhuǎn)換上屈扎,可以直接用RACSequence直接處理埃唯,內(nèi)部是懶加載實(shí)現(xiàn)的,有一定個(gè)的內(nèi)存優(yōu)化

2鹰晨、錯(cuò)誤統(tǒng)一處理上墨叛,我們可以通過(guò)RACSuject同意處理錯(cuò)誤邏輯

3、邏輯處理上模蜡,通過(guò)信號(hào)統(tǒng)一管理數(shù)據(jù)漠趁,信號(hào)激活也是懶加載形式的,有一定的性能優(yōu)化忍疾,在下拉刷新上也大大減少的代碼量闯传。

4、通過(guò)RACCommand進(jìn)行管理卤妒,我們可以按需執(zhí)行丸边,實(shí)時(shí)檢測(cè)執(zhí)行狀態(tài),是否可以被執(zhí)行等荚孵。

5妹窖、代碼上的簡(jiǎn)潔,省去大量的if else ?for等收叶,也省去了很多的方法嵌套方法骄呼,所有的下一步事件都可以通過(guò)嵌套block來(lái)實(shí)現(xiàn)。


相應(yīng)問(wèn)題:

1、模型轉(zhuǎn)換

RAC提供的模型轉(zhuǎn)換是懶加載的(用數(shù)據(jù)中的哪一個(gè)才進(jìn)行轉(zhuǎn)換哪一個(gè))蜓萄,我們要根據(jù)自己的需要看看是直接在數(shù)據(jù)源轉(zhuǎn)換模型隅茎,還是在使用時(shí)在進(jìn)行模型轉(zhuǎn)換。

同樣的數(shù)據(jù)直接用mj_的方法轉(zhuǎn)換嫉沽,耗時(shí): 0.009762辟犀,用RAC自帶的dictArr.rac_sequence map進(jìn)行循環(huán)轉(zhuǎn)換耗時(shí): 0.012227,明顯體現(xiàn)出mj_的

2绸硕、RAC優(yōu)勢(shì):函數(shù)響應(yīng)式框架

響應(yīng)式編程:不需要考慮順序堂竟,只需要知道結(jié)果,萬(wàn)物皆是流

函數(shù)式編程:把操作盡量寫成一系列嵌套或方法調(diào)用玻佩,在ios中就是block中套block

3出嘹、數(shù)據(jù)綁定:

注意我們觀察的是模型對(duì)象,并不是模型對(duì)象里面的某一個(gè)屬性咬崔,這樣是觀察不到的税稼。

注意事項(xiàng):在綁定的時(shí)候我們可以在函數(shù)里添加filter、map垮斯、skip郎仆、、等方法兜蠕,不需要在不斷的進(jìn)行循環(huán)或者if else了丸升,非常的方便,也便于管理牺氨。

4狡耻、替換對(duì)象:代理、按鈕事件猴凹、消息中心夷狰、KVO、KVC郊霎、監(jiān)聽(tīng)文本框文字改變沼头、等等,都可以通過(guò)流對(duì)象书劝、訂閱流进倍、管理流、銷毀流來(lái)處理购对,非常的耦合猾昆,不需要來(lái)回的相互跳轉(zhuǎn)了。

5骡苞、用了RAC代碼中少了相互跳轉(zhuǎn)垂蜗、少了if else楷扬、少了for循環(huán)、少了代理等等贴见,都是代碼的優(yōu)化烘苹、少了方法和方法之間的調(diào)用,多了block的嵌套片部。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末镣衡,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子档悠,更是在濱河造成了極大的恐慌廊鸥,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件站粟,死亡現(xiàn)場(chǎng)離奇詭異黍图,居然都是意外死亡曾雕,警方通過(guò)查閱死者的電腦和手機(jī)奴烙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)剖张,“玉大人切诀,你說(shuō)我怎么就攤上這事∩ε” “怎么了幅虑?”我有些...
    開(kāi)封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)顾犹。 經(jīng)常有香客問(wèn)我倒庵,道長(zhǎng),這世上最難降的妖魔是什么炫刷? 我笑而不...
    開(kāi)封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任擎宝,我火速辦了婚禮,結(jié)果婚禮上浑玛,老公的妹妹穿的比我還像新娘绍申。我一直安慰自己,他們只是感情好顾彰,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布极阅。 她就那樣靜靜地躺著,像睡著了一般涨享。 火紅的嫁衣襯著肌膚如雪筋搏。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天厕隧,我揣著相機(jī)與錄音拆又,去河邊找鬼儒旬。 笑死,一個(gè)胖子當(dāng)著我的面吹牛帖族,可吹牛的內(nèi)容都是我干的栈源。 我是一名探鬼主播,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼竖般,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼甚垦!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起涣雕,我...
    開(kāi)封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤艰亮,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后挣郭,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體迄埃,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年兑障,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了侄非。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡流译,死狀恐怖逞怨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情福澡,我是刑警寧澤叠赦,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站革砸,受9級(jí)特大地震影響除秀,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜算利,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一册踩、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧笔时,春花似錦棍好、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至较锡,卻和暖如春业稼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蚂蕴。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工低散, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留俯邓,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓熔号,卻偏偏與公主長(zhǎng)得像稽鞭,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子引镊,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

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