文章前言
一般在使用一個(gè)框架之前需要了解的事情蜂大,也就是需要了解的東西闽铐,本人總結(jié)了一下有下面幾點(diǎn)(比較淺顯,歡迎噴口水):
1. 這個(gè)框架有什么用奶浦,即這個(gè)框架能夠給我?guī)硎裁醋饔?/h5>
2. 怎么集成這個(gè)框架
3. 框架的使用方法
下面就從這幾個(gè)點(diǎn)展開
一兄墅、這個(gè)框架有什么用,即這個(gè)框架能夠給我?guī)硎裁醋饔?/h3>
- 在我們iOS開發(fā)過程中澳叉,當(dāng)某些事件響應(yīng)的時(shí)候隙咸,需要處理某些業(yè)務(wù)邏輯,這些事件都用不同的方式來處理。
- 比如按鈕的點(diǎn)擊使用action成洗,使用delegate五督,屬性值改變使用KVO,通知等系統(tǒng)提供的方式。都可以通過RAC處理
- ReactiveCocoa為事件提供了很多處理方法瓶殃,而且利用RAC處理事件很方便概荷,可以把要處理的事情,和監(jiān)聽的事情的代碼放在一起碌燕,這樣非常方便我們管理误证,就不需要跳到對應(yīng)的方法里。非常符合我們開發(fā)中高內(nèi)聚修壕,低耦合的思想愈捅。
-
二、 怎么集成這個(gè)框架(這里只介紹cocoaPods的集成方法)
- OC版的ReactiveCocoa(下面簡稱RAC)集成方法
pod 'ReactiveObjC'或者pod 'ReactiveObjC', '~> 指定版本'
- swift版的ReactiveCocoa集成方法
pod 'ReactiveCocoa'或者pod 'ReactiveCocoa', '~> 指定版本'
- 在我們iOS開發(fā)過程中澳叉,當(dāng)某些事件響應(yīng)的時(shí)候隙咸,需要處理某些業(yè)務(wù)邏輯,這些事件都用不同的方式來處理。
- 比如按鈕的點(diǎn)擊使用action成洗,使用delegate五督,屬性值改變使用KVO,通知等系統(tǒng)提供的方式。都可以通過RAC處理
- ReactiveCocoa為事件提供了很多處理方法瓶殃,而且利用RAC處理事件很方便概荷,可以把要處理的事情,和監(jiān)聽的事情的代碼放在一起碌燕,這樣非常方便我們管理误证,就不需要跳到對應(yīng)的方法里。非常符合我們開發(fā)中高內(nèi)聚修壕,低耦合的思想愈捅。
二、 怎么集成這個(gè)框架(這里只介紹cocoaPods的集成方法)
- OC版的ReactiveCocoa(下面簡稱RAC)集成方法
pod 'ReactiveObjC'或者pod 'ReactiveObjC', '~> 指定版本'
- swift版的ReactiveCocoa集成方法
pod 'ReactiveCocoa'或者pod 'ReactiveCocoa', '~> 指定版本'
相信集成這個(gè)框架對于一個(gè)iOS開發(fā)者來說并不是什么難事慈鸠,下面就介紹框架的幾種常用方法廢話不多說直接上代碼
三蓝谨、框架的使用方法
1. RACSignal框架中最常用的一個(gè)類
- RACSiganl:信號(hào)類,表示將來有數(shù)據(jù)傳遞,只要有數(shù)據(jù)改變,信號(hào)內(nèi)部接收到數(shù)據(jù)譬巫,就會(huì)馬上發(fā)出數(shù)據(jù)
- 默認(rèn)一個(gè)信號(hào)都是冷信號(hào)显歧,也就是值改變了帘睦,也不會(huì)觸發(fā),只有訂閱了這個(gè)信號(hào),這個(gè)信號(hào)才會(huì)變?yōu)闊嵝盘?hào)添忘,值改變了才會(huì)觸發(fā)儡蔓。
- 如何訂閱信號(hào):調(diào)用信號(hào)RACSignal的subscribeNext就能訂閱外厂。
2. RACSignal使用步驟
- 創(chuàng)建信號(hào)
+ (RACSignal *)createSignal:(RACDisposable * (^)(id subscriber))didSubscribe
當(dāng)然還有其他的創(chuàng)建方法泥畅,可以自行嘗試
- 訂閱信號(hào),才會(huì)激活信號(hào)
- (RACDisposable *)subscribeNext:(void (^)(id x))nextBlock
- 發(fā)送信號(hào)
- (void)sendNext:(id)value
這里發(fā)送信號(hào)的入?yún)alue,可以是網(wǎng)絡(luò)請求的返回值凭豪,以及各種你想要傳遞出去的東西
上代碼
//1.創(chuàng)建信號(hào)
RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id subscriber) {
//保存起來 就不會(huì)被取消訂閱
_subscriber = subscriber;
//3.發(fā)送信號(hào)
[subscriber sendNext:@1];
return [RACDisposable disposableWithBlock:^{
NSLog(@"默認(rèn)信號(hào)發(fā)送完畢被取消");
}];
}];
//如果要取消就拿到 RACDisposable
//2.訂閱信號(hào)
RACDisposable *disposable = [signal subscribeNext:^(id x) {
NSLog(@"%@",x);
}];
//取消訂閱
[disposable dispose];
}
看過上面的方法焙蹭,再來看一波網(wǎng)絡(luò)請求的使用方法
[RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
// 這里進(jìn)行一個(gè)網(wǎng)絡(luò)請求
DELAY(1000000000000);
// 如果請求成功就發(fā)送next和complete事件,如果失敗就發(fā)送error事件
[subscriber sendNext:@"第一個(gè)任務(wù)"];
// 這里記住一定要調(diào)用sendCompleted方法,因?yàn)椴徽{(diào)用完成這個(gè)方法嫂伞,信號(hào)就不會(huì)銷毀孔厉,一直占用著內(nèi)存,這個(gè)是開發(fā)者們最不希望看到的
[subscriber sendCompleted];
// [subscriber sendError:nil];
return [RACDisposable disposableWithBlock:^{
NSLog(@"默認(rèn)信號(hào)發(fā)送完畢后就會(huì)被銷毀帖努,沒有訂閱者的時(shí)候就會(huì)被銷毀");
}];
}];
到這里撰豺,我覺得RACSignal信號(hào)類的使用方法應(yīng)該能夠掌握了,這里講解一下代碼里用到的一些類和協(xié)議
- RACSubscriber:表示訂閱者的意思然磷,用于發(fā)送信號(hào)郑趁,這是一個(gè)協(xié)議,不是一個(gè)類姿搜,只要遵守這個(gè)協(xié)議寡润,并且實(shí)現(xiàn)方法才能成為訂閱者。通過create創(chuàng)建的信號(hào)舅柜,都有一個(gè)訂閱者梭纹,幫助他發(fā)送數(shù)據(jù)。
- RACDisposable:用于取消訂閱或者清理資源致份,當(dāng)信號(hào)發(fā)送完成或者發(fā)送錯(cuò)誤的時(shí)候变抽,就會(huì)自動(dòng)觸發(fā)它。
使用場景:不想監(jiān)聽某個(gè)信號(hào)時(shí)氮块,可以通過它主動(dòng)取消訂閱信號(hào)绍载。
3. 回看到文章的開頭,RAC的作用第二點(diǎn)
比如按鈕的點(diǎn)擊使用action滔蝉,使用delegate击儡,屬性值改變使用KVO,通知等系統(tǒng)提供的方式。都可以通過RAC處理
下面就介紹一些常用的用法不僅可以節(jié)約開發(fā)時(shí)間蝠引,而且可以使邏輯代碼更加的集中阳谍,舉個(gè)例子:給按鈕添加一個(gè)target蛀柴,首先需要addtarget,然后需要寫一個(gè)方法實(shí)現(xiàn)矫夯,其實(shí)系統(tǒng)的也不麻煩鸽疾,但是RAC給我們提供了更加快捷的方案,請看表演:
/**
按鈕的點(diǎn)擊事件
*/
- (void)addButtonTarget {
UIButton *loginButton = [[UIButton alloc] init];
loginButton.backgroundColor = [UIColor grayColor];
loginButton.frame = CGRectMake(150, 220, 100, 100);
[self.view addSubview:loginButton];
[[loginButton rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(__kindof UIControl * _Nullable x) {
NSLog(@"%@", x);
}];
}
想必看到這里大家應(yīng)該能夠看到快捷的地方了训貌,不用添加target制肮,不用再定義一個(gè)方法!這個(gè)解釋一下代碼
- rac_signalForControlEvents這個(gè)方法的返回值其實(shí)是一個(gè)信號(hào)類旺订,即RACSignal類弄企,再會(huì)看到上面提到的RACSignal的使用方法超燃,先創(chuàng)建信號(hào)区拳,其實(shí)這里內(nèi)部就會(huì)創(chuàng)建一個(gè)信號(hào)并且返回
- subscribeNext這里就是訂閱信號(hào)了
- 最后發(fā)送信號(hào),你可以在subscribeNext的block里面看到意乓,里面的參數(shù)樱调,其實(shí)就是點(diǎn)擊按鈕傳遞出來的值,可以理解為信號(hào)攜帶的值
這里再舉一個(gè)例子:監(jiān)聽文本輸入框事件届良。相信大家在開發(fā)中經(jīng)常會(huì)遇到需要監(jiān)聽文本框笆凌,以此來對付產(chǎn)品提出的各種逆天并且領(lǐng)先科技N年的想法,通常做法都是addtarget士葫,或者delegate乞而,實(shí)現(xiàn)各種代理方法,這里使用RAC可以達(dá)到異曲同工的效果慢显,上代碼:
/**
監(jiān)聽文本框的輸入
*/
- (void)textFieldChange {
UITextField *textFidle = [[UITextField alloc] init];
textFidle.frame = CGRectMake(100, 100, 200, 40);
textFidle.backgroundColor = [UIColor grayColor];
[self.view addSubview:textFidle];
// 監(jiān)聽文本框的輸入,而且只有大于3個(gè)長度的時(shí)候才會(huì)打印
[[textFidle.rac_textSignal filter:^BOOL(NSString * _Nullable value) {
return value.length > 3;
}]
subscribeNext:^(NSString * _Nullable x) {
NSLog(@"%@", x);
}];
}
這里講解一下代碼
- textFidle.rac_textSignal這里會(huì)返回一個(gè)信號(hào)爪模,直接訂閱該信號(hào)就可以拿到輸入框里的內(nèi)容了
- 這里可以看到有一個(gè)新的東西filter,這個(gè)可以理解為篩選過濾的意思,需要返回一個(gè)bool值荚藻,即只有返回YES的時(shí)候subscribeNext屋灌,這個(gè)block才會(huì)調(diào)用,可以理解為只有給出通行證应狱,才可以繼續(xù)往下面執(zhí)行共郭,filter返回的還是一個(gè)RACSignal類
后續(xù)更新內(nèi)容
- 結(jié)合實(shí)際開發(fā)場景,使用RAC解決輸入框疾呻,按鈕點(diǎn)擊聯(lián)動(dòng)邏輯
- 組合信號(hào)的使用方法以及使用場景
- 快速解決多個(gè)任務(wù)需要按照順序執(zhí)行的需求
- 在開發(fā)中經(jīng)常需要執(zhí)行多個(gè)請求除嘹,然后再執(zhí)行后續(xù)的任務(wù)(讓你不再使用GCD中的任務(wù)調(diào)度組)
- 在開發(fā)中共需要按照順序執(zhí)行多個(gè)請求,幫助你更好的解決問題
- 網(wǎng)絡(luò)請求的封裝(RACCommand)
- 代理的使用方法