初識(shí) RAC

一.RAC 是什么否过?能做什么?

1.RAC是Reactive Cocoa的簡(jiǎn)稱膨蛮,是一種支持函數(shù)式響應(yīng)式編程的框架叠纹,由GitHub團(tuán)隊(duì)編寫(xiě)而成。

2.RAC可以做什么呢敞葛?
RAC通過(guò)信號(hào)的方式誉察,鏈接組合和反應(yīng)。通過(guò)一個(gè)統(tǒng)一的方法來(lái)處理異步行為惹谐,包括通知(NotificationCenter)持偏、委托代理(Delegate)、目標(biāo)操作機(jī)制(AddTarget)氨肌、KVO鸿秆、回調(diào)Block。
也就是通過(guò)block的方式怎囚,來(lái)處理和簡(jiǎn)化這些異步行為卿叽。

3.版本大事件:
2.5以及之前版本不支持swift。
3.0版本ReactiveObjC是支持OC的最后一個(gè)版本恳守。
4.0版本ReactiveSwift開(kāi)始只支持swift考婴。

二.為什么用RAC? 優(yōu)缺點(diǎn)!

喜歡一個(gè)人,往往是從他身上的某個(gè)閃光點(diǎn)開(kāi)始催烘。

1.RAC有哪些閃光點(diǎn)沥阱?[需要進(jìn)一步了解]
a.簡(jiǎn)潔高效,一行代碼能解決的問(wèn)題就不要用多行了(就不能寫(xiě)半行??)
b.注冊(cè)的通知伊群,不需要釋放考杉,RAC內(nèi)部幫你做了策精。

2.缺點(diǎn)
a.高耦合性
b.需要進(jìn)一步了解


三.怎么使用ARC?

1.使用pod方式進(jìn)行安裝崇棠,GiTHub團(tuán)隊(duì)已經(jīng)將支持OC和swift的支持庫(kù)分開(kāi)了咽袜,使用OC的可以

pod 'ReactiveObjC', '~> 3.0.0'

2.引入頭文件

#import <ReactiveObjC/ReactiveObjC.h>

3.開(kāi)始進(jìn)入正題。
RAC是通過(guò)信號(hào)方式易茬,鏈接組合和反應(yīng)酬蹋。所以要有三步及老,創(chuàng)建信號(hào)抽莱、監(jiān)聽(tīng)信號(hào)、發(fā)送信號(hào)骄恶、(訂閱信號(hào))食铐。
RAC發(fā)送信號(hào)包括了三種情況,下一步該做什么僧鲁、成功之后做什么虐呻、失敗(出錯(cuò))之后該做什么寞秃。


3E9F1542F5CB44B234EE93713D1F58A6.jpg
    // 創(chuàng)建信號(hào)
    RACSignal *signal = [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
    
        // 發(fā)送信號(hào)斟叼,有三種情況,下一步春寿,出錯(cuò)朗涩、失敗
        [subscriber sendNext:@"RAC 我來(lái)了!"];
        [subscriber sendError:nil];
        [subscriber sendCompleted];
 
        return nil;
    }];
    
    // 訂閱信號(hào) (也可以分開(kāi)寫(xiě))
    [signal subscribeNext:^(id  _Nullable x) {
        
        NSLog(@"%@",x);

    } error:^(NSError * _Nullable error) {
        
        NSLog(@"%@",error);

    } completed:^{
        
        NSLog(@"RAC 成功到達(dá)地球");
    }];

// ----------------也可以簡(jiǎn)化寫(xiě)法-----------------------
    // 創(chuàng)建信號(hào)
    [[RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
        
        // 發(fā)送信號(hào)
        [subscriber sendNext:@"RAC 我來(lái)了绑改!"];
        
        return nil;
    }] subscribeNext:^(id  _Nullable x) {
        
        NSLog(@"%@",x);
    }];

4.避免循環(huán)引用谢床,在block內(nèi)部用self來(lái)引用控制器的成員變量, 可能會(huì)造成循環(huán)引用厘线,這個(gè)時(shí)候在“外部用@weakify识腿,內(nèi)部用@strongify”這個(gè)方式來(lái)解決,如果直接用“_”來(lái)引用成員變量造壮,可能會(huì)解決不了循環(huán)引用的問(wèn)題

    //問(wèn)題:在信號(hào)中打印了控制器渡讼,也就是強(qiáng)引用了控制器,控制器中又強(qiáng)引用了信號(hào)耳璧,如下成箫,就會(huì)形成循環(huán)應(yīng)用
    //信號(hào)外部用@weakify,內(nèi)部用@strongify
    @weakify(self)
    
   RACSignal *signal = [[btn rac_signalForControlEvents:UIControlEventTouchUpInside]subscr subscribeNext:^(__kindof UIControl * _Nullable x) {
        
        @strongify(self);
       self.lable.text = @"這是來(lái)自RAC的信號(hào)@懵铡N爸凇!";
       
    }];
    
    self.signal = signal;

4.RAC中實(shí)現(xiàn)KVO
可以通過(guò)宏RACObserve來(lái)實(shí)現(xiàn)召廷,絕壁一行代碼凳厢,替代addObserver: forKeyPath:options: context:(void *)context

RAC中強(qiáng)大的宏账胧,拿來(lái)小用一下Observe
#define RACObserve(TARGET, KEYPATH) _RACObserve(TARGET, KEYPATH)
  
    // 當(dāng)對(duì)象self.dog的屬性nickName發(fā)生變化時(shí),就會(huì)調(diào)用這個(gè)block
    [RACObserve(self.dog, nickName) subscribeNext:^(id  _Nullable x) {
        self.label.text = x;  // x是subScribe發(fā)送的內(nèi)容
    }];

5.RAC中實(shí)現(xiàn)控件的事件(addTarget)
查看源碼可以看到先紫,其實(shí)RAC寫(xiě)了一個(gè)UIControl的分類(lèi) "UIControl+RACSignalSupport.h"治泥,在分類(lèi)中完成了信號(hào)的三部曲,創(chuàng)建信號(hào)遮精、訂閱信號(hào)居夹、發(fā)布信號(hào)。

    [[self.btn rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(__kindof UIControl * _Nullable x) {
        
        NSLog(@"使用RAC添加按鈕事件1境濉W贾!");
    }];

6.RAC中有關(guān)控件檬洞,比較好玩的地方狸膏,真心推薦應(yīng)該玩一下。
想用什么控件添怔,就去RAC包中去找相關(guān)的擴(kuò)展就好了湾戳,不多說(shuō),代碼走起广料。砾脑。。比如監(jiān)聽(tīng)UITextField的輸入


圖片.png

// 傳統(tǒng)方式監(jiān)聽(tīng)UITextField的輸入艾杏,需要很多代碼,這里不多說(shuō),
// 使用ARC是怎么玩起來(lái)的呢韧衣?好吧,開(kāi)始你的表演糜颠!別忘去哪里找汹族?
// 去RAC包中有關(guān)UITextField的擴(kuò)展,你會(huì)發(fā)現(xiàn)這個(gè)擴(kuò)展其實(shí)都叫做
// RACSignalSupport

    [[self.textField rac_textSignal] subscribeNext:^(NSString * _Nullable x) {
       
        NSLog(@"textField==>text ==>%@",x);
    }];

7.同時(shí)獲取多個(gè)控件的變化其兴,在RAC中就是將多個(gè)信號(hào)合并成一個(gè)信號(hào)進(jìn)行處理顶瞒,使用+ (RACSignal *)combineLatest:(id<NSFastEnumeration>)signals
so easy!最好不要超過(guò)5個(gè)(因?yàn)橄拗屏四卦C據(jù)在下面代碼里)榴徐。

    [[RACSignal combineLatest:@[self.textField.rac_textSignal,self.textField2.rac_textSignal]] subscribeNext:^(RACTuple * _Nullable x) {
      
        NSString *name = x.first;
        NSString *pwd = x.second;
        
        NSLog(@"name===>%@,pwd===>%@",name,pwd);
    }];


// --------------限制個(gè)數(shù)的證據(jù)在此--------------
typedef struct {
    unsigned long state;
    id __unsafe_unretained _Nullable * _Nullable itemsPtr;
    unsigned long * _Nullable mutationsPtr;
    unsigned long extra[5];
} NSFastEnumerationState;

// --------------限制個(gè)數(shù)的證據(jù)在此--------------

8.巧妙使用reduce,合并信號(hào)的數(shù)據(jù)匀归,進(jìn)行統(tǒng)計(jì)計(jì)算使用坑资,例如判斷手機(jī)號(hào)和密碼同時(shí)存在,才可以點(diǎn)擊登錄按鈕

    [[RACSignal combineLatest:@[nameTextField.rac_textSignal, pwdTextField.rac_textSignal] reduce:^id _Nullable(NSString * name, NSString * pwd){
        
        NSLog(@"%@ ,%@", name,pwd);
        
        return @(name.length > 0 && pwd.length > 0);
        
        return nil;
        
    }] subscribeNext:^(id  _Nullable x) {
        NSLog(@"%@",x);
        
        _demoButton.enabled = [x boolValue];
    }];






備注: 如果pod安裝穆端,遇到一下錯(cuò)誤
圖片.png

解決方法:在pod 'ReactiveCocoa’,’~>3.0’前面添加use_frameworks!

use_frameworks!
pod 'ReactiveCocoa’,’~>3.0’

原因:對(duì)于 Swift 項(xiàng)目袱贮,CocoaPods 提供了動(dòng)態(tài) Framework 的支持。通過(guò) use_frameworks! 選項(xiàng)控制体啰。對(duì)于 Swift 寫(xiě)的庫(kù)來(lái)說(shuō)攒巍,想通過(guò) CocoaPods 引入工程嗽仪,必須加入 use_frameworks! 選項(xiàng)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末柒莉,一起剝皮案震驚了整個(gè)濱河市闻坚,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌兢孝,老刑警劉巖窿凤,帶你破解...
    沈念sama閱讀 206,214評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異跨蟹,居然都是意外死亡雳殊,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)喷市,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)相种,“玉大人,你說(shuō)我怎么就攤上這事品姓。” “怎么了箫措?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,543評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵腹备,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我斤蔓,道長(zhǎng)植酥,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,221評(píng)論 1 279
  • 正文 為了忘掉前任弦牡,我火速辦了婚禮友驮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘驾锰。我一直安慰自己卸留,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,224評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布椭豫。 她就那樣靜靜地躺著耻瑟,像睡著了一般。 火紅的嫁衣襯著肌膚如雪赏酥。 梳的紋絲不亂的頭發(fā)上喳整,一...
    開(kāi)封第一講書(shū)人閱讀 49,007評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音裸扶,去河邊找鬼框都。 笑死,一個(gè)胖子當(dāng)著我的面吹牛呵晨,可吹牛的內(nèi)容都是我干的魏保。 我是一名探鬼主播蔗蹋,決...
    沈念sama閱讀 38,313評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼囱淋!你這毒婦竟也來(lái)了猪杭?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,956評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤妥衣,失蹤者是張志新(化名)和其女友劉穎皂吮,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體税手,經(jīng)...
    沈念sama閱讀 43,441評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蜂筹,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,925評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了芦倒。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片艺挪。...
    茶點(diǎn)故事閱讀 38,018評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖兵扬,靈堂內(nèi)的尸體忽然破棺而出麻裳,到底是詐尸還是另有隱情,我是刑警寧澤器钟,帶...
    沈念sama閱讀 33,685評(píng)論 4 322
  • 正文 年R本政府宣布津坑,位于F島的核電站,受9級(jí)特大地震影響傲霸,放射性物質(zhì)發(fā)生泄漏疆瑰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,234評(píng)論 3 307
  • 文/蒙蒙 一昙啄、第九天 我趴在偏房一處隱蔽的房頂上張望穆役。 院中可真熱鬧,春花似錦梳凛、人聲如沸耿币。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,240評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)掰读。三九已至,卻和暖如春叭莫,著一層夾襖步出監(jiān)牢的瞬間蹈集,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,464評(píng)論 1 261
  • 我被黑心中介騙來(lái)泰國(guó)打工雇初, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留拢肆,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,467評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像郭怪,于是被迫代替她去往敵國(guó)和親支示。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,762評(píng)論 2 345

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

  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)鄙才、插件颂鸿、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,022評(píng)論 4 62
  • 本人有若干成套學(xué)習(xí)視頻, 可試看! 可試看! 可試看, 重要的事情說(shuō)三遍 包含Java, 數(shù)據(jù)結(jié)構(gòu)與算法, iOS...
    小冰山口閱讀 643評(píng)論 5 7
  • 《汽車(chē)銷(xiāo)售那些事兒》目錄 汽車(chē)銷(xiāo)售那些事兒14 汽車(chē)銷(xiāo)售那些事兒12 因?yàn)樯衔绲氖虑椋昀镞M(jìn)行調(diào)整攒庵,顏顏也得以按時(shí)...
    Easyway閱讀 249評(píng)論 0 0
  • 我喜歡玩樂(lè)嘴纺,小時(shí)候喜歡和小朋友做游戲,跳方格浓冒、玩彈珠栽渴、斗雞、拍畫(huà)片稳懒、摔皮卡……好多都是男孩子才玩的闲擦,可我一個(gè)女孩子...
    應(yīng)小添閱讀 333評(píng)論 1 1
  • 刷微博辙谜、玩微信俺榆、看頭條、逛知乎……遇到的好文打算收藏后再看装哆,但之后卻從未打開(kāi)過(guò)……這是病,得治岸ㄉぁ蜕琴!刷微博、玩微信宵溅、...
    21號(hào)空間閱讀 271評(píng)論 0 1