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í)例:
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í)現(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)的,并且支持取消操作
清潔工:
垃圾回收胶惰,這個(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的嵌套片部。