ReactiveCocoa基礎使用

簡介

RAC(ReactiveCocoa)是一款響應式編程的框架迹缀,處理事件邏輯空另,代理通知KVO都可以使用RAC來解決漾岳。利用好它可以省1/2的邏輯代碼狸臣。夠吸引你嗎莹桅?那就開始學習吧,向大神邁進烛亦。


1.CocoaPods導入

OC: pod 'ReactiveCocoa', '~> 2.5'
Swift:pod 'ReactiveCocoa'


2.信號RACSignal

  • RACSiganl:信號類,一般表示將來有數(shù)據(jù)傳遞诈泼,只要有數(shù)據(jù)改變,信號內部接收到數(shù)據(jù)煤禽,就會馬上發(fā)出數(shù)據(jù)铐达。就像發(fā)送通知一樣。
  • RACSubscriber:表示訂閱者的意思檬果,用于發(fā)送信號瓮孙,這是一個協(xié)議唐断,不是一個類,只要遵守這個協(xié)議杭抠,并且實現(xiàn)方法才能成為訂閱者脸甘。就像注冊通知一樣。
  • RACDisposable:用于取消訂閱或者清理資源偏灿,當信號發(fā)送完成或者發(fā)送錯誤的時候丹诀,就會自動觸發(fā)它。就像銷毀通知一樣翁垂。
  • 其他類高級使用中講到铆遭。

3.RAC常見用法

  • 代替代理

rac_signalForSelector 自定義view上有個按鈕。

[[self.redView rac_signalForSelector:@selector(btnClick:)] subscribeNext:^(id x) {
     NSLog(@"點擊了紅色按鈕");
}];
  • 代替KVO

rac_valuesAndChangesForKeyPath監(jiān)聽view的屬性變化

[[self.redView rac_valuesAndChangesForKeyPath:@"center" options:NSKeyValueObservingOptionNew observer:nil] subscribeNext:^(id x) {
     NSLog(@"位置變了");
}];
  • 監(jiān)聽事件

rac_signalForControlEvents監(jiān)聽各類事件

[[self.testButton rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) {
     NSLog(@"點擊了button%@",x);
}];
  • 代替通知

rac_addObserverForName代替通知

[[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIKeyboardWillShowNotification object:nil] subscribeNext:^(NSNotification *notification) {
        NSDictionary *info = notification.userInfo;
        NSValue *keyboardFrameValue = [info objectForKey:UIKeyboardFrameEndUserInfoKey];
        CGRect keyboardFrame = keyboardFrameValue.CGRectValue;
        NSLog(@"height----%f",keyboardFrame.size.height);
}];
  • 文字框變化

rac_textSignal監(jiān)聽textfield的變化

[self.password.rac_textSignal subscribeNext:^(id x) {
        NSLog(@"%@",x);
}];
  • 多事件完成后統(tǒng)一處理

rac_liftSelector:withSignalsFromArray:Signals多網(wǎng)絡請求后統(tǒng)一更新UI

RACSignal *request1 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
      dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
          [subscriber sendNext:@"請求1"];
          NSLog(@"11111");
      });
      return nil;
}];
RACSignal *request2 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(8.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
         [subscriber sendNext:@"請求2"];
         NSLog(@"222");
     });
     return nil;
}];
    
[self rac_liftSelector:@selector(updateUIWithR1:r2:) withSignalsFromArray:@[request1,request2]];
//更新UI
- (void)updateUIWithR1:(id)data1 r2:(id)data2
{
    NSLog(@"更新UI%@----%@",data1,data2);
}
  • 信號隊列,處理多事件順序執(zhí)行
RACSignal *singal1 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
      [subscriber sendNext:@"one"];
      return nil;
}];
    
RACSignal *singal2 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
      [subscriber sendNext:@"two"];
      return nil;
}];
    
RACSignal *singal3 = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
      [subscriber sendNext:@"three"];
      return nil;
}];
    
[[RACSignal merge:@[singal3,singal2,singal1]] subscribeNext:^(id x) {
      NSLog(@"信號隊列----%@",x);
}];
RAC(self.passwordLabel, text) = self.password.rac_textSignal;
    
    RACTuple *tuple = RACTuplePack(@"hl",@24);
    RACTupleUnpack(NSString *name,NSNumber *age) = tuple;
    NSLog(@"%@---%@",name,age);
    
    [RACObserve(self.redView, center) subscribeNext:^(id x) {
        NSLog(@"333%@",x);
    }];
  • 組合操作
    [self.phoneTextField.rac_textSignal subscribeNext:^(NSString *x) {
        self.phone = x;
    }];
    
    [self.passwordTextField.rac_textSignal subscribeNext:^(NSString *x) {
        self.pswd = x;
    }];
    
    [[[RACSignal combineLatest:@[RACObserve(self, phone),RACObserve(self, pswd)] reduce:^(NSString *txt1,NSString *txt2){
        return @(txt1.length > 2 && txt2.length > 2);
    }] distinctUntilChanged] subscribeNext:^(NSNumber *x) {
        if ([x boolValue]) {
            NSLog(@"yes");
        }else {
            NSLog(@"no");
        }
    }];

最后

demo地址:github

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末沿猜,一起剝皮案震驚了整個濱河市枚荣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌啼肩,老刑警劉巖棍弄,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異疟游,居然都是意外死亡呼畸,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門颁虐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蛮原,“玉大人,你說我怎么就攤上這事另绩∪逶桑” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵笋籽,是天一觀的道長蹦漠。 經常有香客問我,道長车海,這世上最難降的妖魔是什么笛园? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮侍芝,結果婚禮上研铆,老公的妹妹穿的比我還像新娘。我一直安慰自己州叠,他們只是感情好棵红,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著咧栗,像睡著了一般逆甜。 火紅的嫁衣襯著肌膚如雪虱肄。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天交煞,我揣著相機與錄音浩峡,去河邊找鬼。 笑死错敢,一個胖子當著我的面吹牛翰灾,可吹牛的內容都是我干的。 我是一名探鬼主播稚茅,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼纸淮,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了亚享?” 一聲冷哼從身側響起咽块,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎欺税,沒想到半個月后侈沪,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扎酷,經...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡蔬充,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了欣喧。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片歼秽。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡应役,死狀恐怖,靈堂內的尸體忽然破棺而出燥筷,到底是詐尸還是另有隱情箩祥,我是刑警寧澤,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布肆氓,位于F島的核電站袍祖,受9級特大地震影響,放射性物質發(fā)生泄漏谢揪。R本人自食惡果不足惜蕉陋,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望键耕。 院中可真熱鬧寺滚,春花似錦、人聲如沸屈雄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽酒奶。三九已至蚁孔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間惋嚎,已是汗流浹背杠氢。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留另伍,地道東北人鼻百。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像摆尝,于是被迫代替她去往敵國和親温艇。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內容