一、RAC簡(jiǎn)介
1秸脱、RAC全稱:ReactiveCocoa, Github 一個(gè)開(kāi)源框架
2部蛇、ReactiveCocoa:函數(shù)響應(yīng)編程框架?
3摊唇、目的:事件的監(jiān)聽(tīng),接管了蘋(píng)果所有的事件機(jī)制(addTarget涯鲁,代理巷查,通知,KVO)
總結(jié):RAC是一套重量級(jí)響應(yīng)式函數(shù)式編程開(kāi)源框架抹腿,它可以幫助我們簡(jiǎn)單的處理事件岛请。它具有高聚合低耦合的特性。
注意:Block中的循環(huán)引用問(wèn)題
二警绩、RAC使用
1崇败、導(dǎo)入ReactiveObjC ------- 使用CocoaPads來(lái)集成?pod 'ReactiveObjC'
2、#import?<ReactiveObjC.h>
3肩祥、以下就是信號(hào)三部曲后室,下面我們來(lái)看代碼的實(shí)現(xiàn):
? ?//1.創(chuàng)建信號(hào)
? ? //創(chuàng)建一個(gè)數(shù)組,在信號(hào)對(duì)象中
? ? RACSubject*subject = [RACSubject subject];
? ? //2.訂閱信號(hào)
? ? //創(chuàng)建一個(gè)訂閱者混狠,將Block保存到訂閱者中咧擂。將訂閱者保存到第一步創(chuàng)建的數(shù)組中
? ? [subject subscribeNext:^(id? _Nullablex) {
? ? ? ? NSLog(@"接收到了%@",x);
? ? }];
? ? //3.發(fā)送信號(hào)
? ? //遍歷信號(hào)對(duì)象中的數(shù)組,取出訂閱的對(duì)象檀蹋。調(diào)用訂閱者對(duì)象中的Block松申,執(zhí)行。
? ? [subject sendNext:@"發(fā)送的內(nèi)容"];
三俯逾、實(shí)際開(kāi)發(fā)中使用RAC
3.1贸桶、KVO
//RAC的KVO
_person= [[Personalloc]init];
//observer的參數(shù)為nil,所以不需要remove? [_person rac_observeKeyPath:NSStringFromSelector(@selector(name))options:NSKeyValueObservingOptionNewobserver:nilblock:^(idvalue,NSDictionary*change,BOOLcausedByDealloc,BOOLaffectedOnlyLastComponent) {
? ? ? ? NSLog(@"value:%@",value);
}];
//下面的代碼比上面的清爽很多
[[_person rac_valuesForKeyPath:NSStringFromSelector(@selector(name)) observer:nil] subscribeNext:^(id? _Nullable x) {
? ? ? ? NSLog(@"%@",x);
}];
3.2桌肴、NSNotificationCenter
//rac還能監(jiān)聽(tīng)通知的各種事件皇筛。下面就是監(jiān)聽(tīng)了APP退到后臺(tái)的事件。object的參數(shù)為nil坠七,所以不需要移除通知
[[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIApplicationDidEnterBackgroundNotification object:nil] subscribeNext:^(NSNotification * _Nullable x) {
? ? ? ? NSLog(@"%@",x);
}];
3.3水醋、UIButton
[[_btn rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(__kindof UIControl * _Nullable x) {
? ? ? ? NSLog(@"%@",x);
}];
直接在Block中寫(xiě)實(shí)現(xiàn)的代碼旗笔,替代了@selector方法去實(shí)現(xiàn)
3.4、UITextField
[_textfield.rac_textSignal subscribeNext:^(NSString * _Nullable x) {
? ? ? ? NSLog(@"%@",x);
}];
監(jiān)聽(tīng)了輸入框內(nèi)所有的變化拄踪,包括準(zhǔn)備編輯蝇恶,和退出編輯。再也不用寫(xiě)delegate了惶桐,編碼起來(lái)方便快捷
3.5撮弧、宏RAC:RAC(TARGET, ...):獲取某個(gè)信號(hào)的值賦給屬性
//獲取textfield的內(nèi)容變化,賦值給label的text
RAC(_label , text) = _textfield.rac_textSignal;
3.6姚糊、RACObserve(TARGET, KEYPATH):監(jiān)聽(tīng)某個(gè)類的某個(gè)屬性
[RACObserve(self.person,name) subscribeNext:^(id _Nullable x){
????NSLog(@"%@",x);
}];