iOS RAC常用方法總結(jié)

簡介:本文主要對RAC常見使用方法及易混淆的概念和注意事項進行匯總,方便后續(xù)查詢和學習。原文請參考:《ReactiveCocoa 概述》《zwcshy/RAC》常見問題請參考《iOS RAC常見問題匯總》

1.代替代理

//代理
[[self rac_signalForSelector:@selector(tableView:didSelectRowAtIndexPath:) fromProtocol:@protocol(UITableViewDelegate)] subscribeNext:^(id x) {
            
}];

2.監(jiān)聽事件

按鈕點擊

[[self.button rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) {
        
}];

文本內(nèi)容變化

[[self.textField rac_textSignal] subscribeNext:^(NSString * _Nullable x) {
     
}];

手勢事件

UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc]init];
[tap.rac_gestureSignal subscribeNext:^(id x) {

}];

3.通知

[[[NSNotificationCenter defaultCenter] rac_addObserverForName:@"name" object:nil] subscribeNext:^(id x) {
        
}];

4.KVO

//方法1
[[self rac_valuesAndChangesForKeyPath:@"title" options:NSKeyValueObservingOptionNew observer:nil] subscribeNext:^(id x) {
        
}];
//方法2
[[self rac_valuesForKeyPath:@"title" observer:nil] subscribeNext:^(id x) {
        
}];
//方法3
[RACObserve(self, title) subscribeNext:^(id x) {
        
}];

5.定時器

//定時器
RACDisposable * disposable = [[RACSignal interval:1 onScheduler:[RACScheduler scheduler]] subscribeNext:^(id x) {
        
}];
    
//釋放定時器
[disposable dispose];

6.集合遍歷RACSequence

數(shù)組遍歷

//默認在子線程中遍歷
NSArray *numbers = @[@"1",@"2",@"3",@"4"];
[numbers.rac_sequence.signal subscribeNext:^(id x) {
  NSLog(@"%@",x);
}];
//放在主線程中遍歷
[[numbers.rac_sequence.signal deliverOn:[RACScheduler mainThreadScheduler]] subscribeNext:^(id  _Nullable x) {
        
}];

字典遍歷

NSDictionary * dic = @{
    @"1":@"1111",
    @"2":@"2222",
    @"3":@"3333",
    @"4":@"4444"
};

[dic.rac_sequence.signal subscribeNext:^(id x) {
    RACTupleUnpack(NSString * key,NSObject * value) = x;
    NSLog(@"key=%@,value=%@",key,value);
}];

字符串遍歷

NSString *text = @"123456789";
[text.rac_sequence.signal subscribeNext:^(id x) {
   NSLog(@"%@",x);
}];

7.映射Map(生成新的值)flattenMap(生成新的信號)

map(生成新的值)

NSArray * newNumbers = [numbers.rac_sequence map:^id(id value) {
    return  [NSString stringWithFormat:@"numbers: %@",value];
}].array;

flattenMap(生成新的信號)

// 創(chuàng)建信號
RACSubject *subject = [RACSubject subject];
// 綁定信號
RACSignal *bindSignal = [subject flattenMap:^RACStream *(id value) {
// value: 就是源信號發(fā)送的內(nèi)容
// 返回信號用來包裝成修改內(nèi)容的值
return [RACReturnSignal return:value];

}];
// flattenMap中返回的是什么信號榔组,訂閱的就是什么信號(那么,x的值等于value的值绷雏,如果我們操縱value的值那么x也會隨之而變)
// 訂閱信號
[bindSignal subscribeNext:^(id x) {
NSLog(@"%@", x);
}];

// 發(fā)送數(shù)據(jù)
[subject sendNext:@"123"];

8.延時執(zhí)行

throttle:延時調(diào)用block(subscribeNext)

[[[self.button rac_signalForControlEvents:UIControlEventTouchUpInside] throttle:5] subscribeNext:^(id x) {
        
}];

delay:延遲調(diào)用

[[[self.button rac_signalForControlEvents:UIControlEventTouchUpInside] delay:5] subscribeNext:^(id x) {
         
}];

timeout:超時后則不調(diào)用block

[[self.signal timeout:5 onScheduler:[RACScheduler scheduler]] subscribeNext:^(id x) {
}];

延時執(zhí)行

[[RACScheduler scheduler] after:[NSDate dateWithTimeIntervalSinceNow:3] schedule:^{
           
 }];

9.過濾

filter接受滿足條件的信號

[[numbers.rac_sequence.signal filter:^BOOL(id value) {
    return [value integerValue] > 3;
}] subscribeNext:^(id x) {
        
}];
// 只有當文本框的內(nèi)容長度大于5嵌言,才獲取文本框里的內(nèi)容
[[self.textField.rac_textSignal filter:^BOOL(id value) {
// value 源信號的內(nèi)容
return [value length] > 5;
// 返回值 就是過濾條件。只有滿足這個條件才能獲取到內(nèi)容
}] subscribeNext:^(id x) {
  NSLog(@"%@", x);
}];

skip跳過幾個信號

// skip:后邊傳入要跳過幾個信號
RACSubject *subject = [RACSubject subject];
[[subject skip:2] subscribeNext:^(id x) {
NSLog(@"%@", x);
}];
[subject sendNext:@1];
[subject sendNext:@2];
[subject sendNext:@3];

distinctUntilChanged新值與舊值不一樣則接收

//例子1
RACSubject *subject = [RACSubject subject];
[[subject distinctUntilChanged] subscribeNext:^(id x) {
  NSLog(@"%@", x);
}];
// 發(fā)送信號
[subject sendNext:@1];
[subject sendNext:@2];
[subject sendNext:@2]; // 不會被訂閱
//例子2
[[RACObserve(self, title) distinctUntilChanged] subscribeNext:^(id x) {
        
}];

take只拿前幾個值

RACSubject *subject = [RACSubject subject];
[[subject take:2] subscribeNext:^(id x) {
  NSLog(@"%@", x);
}];
// 發(fā)送信號
[subject sendNext:@1];
[subject sendNext:@2];
[subject sendNext:@3];

takeLast取最后幾個值,takeLast 一定要調(diào)用sendCompleted肝箱,告訴他發(fā)送完成才能取到最后的幾個值

RACSubject *subject = [RACSubject subject];
[[subject takeLast:2] subscribeNext:^(id x) {
NSLog(@"%@", x);
}];
// 發(fā)送信號
[subject sendNext:@1];
[subject sendNext:@2];
[subject sendNext:@3];
[subject sendCompleted];

takeUntil給takeUntil傳的是哪個信號哄褒,那么當這個信號發(fā)送信號或sendCompleted,就不能再接受源信號的內(nèi)容了

RACSubject *subject = [RACSubject subject];
RACSubject *subject2 = [RACSubject subject];
[[subject takeUntil:subject2] subscribeNext:^(id x) {
NSLog(@"%@", x);
}];
// 發(fā)送信號
[subject sendNext:@1];
[subject sendNext:@2];
[subject2 sendNext:@3];  // 1
//    [subject2 sendCompleted]; // 或2
[subject sendNext:@4];

ignore:忽略一些值
ignoreValues:表示忽略所有的值

// 1.創(chuàng)建信號
RACSubject *subject = [RACSubject subject];
// 2.忽略一些值
RACSignal *ignoreSignal = [subject ignore:@2]; // ignoreValues:表示忽略所有的值
// 3.訂閱信號
[ignoreSignal subscribeNext:^(id x) {
NSLog(@"%@", x);
}];
// 4.發(fā)送數(shù)據(jù)
[subject sendNext:@2];

10.RAC組合

combine場景:賬號和密碼都有值煌张,登錄按鈕才可點擊

//reduce里的參數(shù)一定要和combineLatest數(shù)組里的一一對應呐赡。
RACSignal *combinSignal = [RACSignal combineLatest:@[self.accountField.rac_textSignal, self.pwdField.rac_textSignal] reduce:^id(NSString *account, NSString *pwd){ NSLog(@"%@ %@", account, pwd);
  return @(account.length && pwd.length);
}];

RAC(self.loginBtn, enabled) = combinSignal;

merge多個信號合并成一個信號,任何一個信號有新值就會調(diào)用

// 創(chuàng)建信號A
RACSubject *signalA = [RACSubject subject];
// 創(chuàng)建信號B
RACSubject *signalB = [RACSubject subject];
//組合信號
RACSignal *mergeSignal = [signalA merge:signalB];
// 訂閱信號
[mergeSignal subscribeNext:^(id x) {
  NSLog(@"%@", x);
}];
// 發(fā)送信號---交換位置則數(shù)據(jù)結(jié)果順序也會交換
[signalB sendNext:@"下部分"];
[signalA sendNext:@"上部分"];

concat:串行執(zhí)行骏融,第一個信號必須要調(diào)用sendCompleted

// 創(chuàng)建信號A
RACSignal *signalA = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
  [subscriber sendNext:@"上部分數(shù)據(jù)"];
  [subscriber sendCompleted]; // 必須要調(diào)用sendCompleted方法链嘀!
  return nil;
}];

// 創(chuàng)建信號B,
RACSignal *signalsB = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
  [subscriber sendNext:@"下部分數(shù)據(jù)"];
  return nil;
}];

// 創(chuàng)建組合信號
RACSignal *concatSignal = [signalA concat:signalsB];
// 訂閱組合信號
[concatSignal subscribeNext:^(id x) {
NSLog(@"%@",x);
}];

其他方法

doNext:添加額外執(zhí)行代碼

[[[self.button rac_signalForControlEvents:UIControlEventTouchUpInside] doNext:^(id x){
    //開始loading
}] subscribeNext:^(id x){
    //結(jié)束loading
}];
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末档玻,一起剝皮案震驚了整個濱河市怀泊,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌误趴,老刑警劉巖霹琼,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異凉当,居然都是意外死亡枣申,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進店門看杭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來糯而,“玉大人,你說我怎么就攤上這事泊窘∠ㄍ眨” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵烘豹,是天一觀的道長瓜贾。 經(jīng)常有香客問我,道長携悯,這世上最難降的妖魔是什么祭芦? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮憔鬼,結(jié)果婚禮上龟劲,老公的妹妹穿的比我還像新娘。我一直安慰自己轴或,他們只是感情好昌跌,可當我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著照雁,像睡著了一般蚕愤。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天萍诱,我揣著相機與錄音悬嗓,去河邊找鬼。 笑死裕坊,一個胖子當著我的面吹牛包竹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播籍凝,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼映企,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了静浴?” 一聲冷哼從身側(cè)響起堰氓,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎苹享,沒想到半個月后双絮,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡得问,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年囤攀,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片宫纬。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡焚挠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出漓骚,到底是詐尸還是另有隱情蝌衔,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布蝌蹂,位于F島的核電站噩斟,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏孤个。R本人自食惡果不足惜剃允,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望齐鲤。 院中可真熱鬧斥废,春花似錦、人聲如沸给郊。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽丑罪。三九已至荚板,卻和暖如春凤壁,著一層夾襖步出監(jiān)牢的瞬間吩屹,已是汗流浹背跪另。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留煤搜,地道東北人免绿。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像擦盾,于是被迫代替她去往敵國和親嘲驾。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,440評論 2 348

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

  • RAC使用測試Demo下載:github.com/FuWees/WPRACTestDemo 1.ReactiveC...
    FuWees閱讀 6,359評論 3 10
  • 前言 由于時間的問題迹卢,暫且只更新這么多了辽故,后續(xù)還會持續(xù)更新本文《最快讓你上手ReactiveCocoa之進階篇》,...
    sumrain_cloud閱讀 1,245評論 0 0
  • 前言由于公司需使用RAC+MVVM模式要寫業(yè)務邏輯腐碱,對于rac菜雞的我誊垢,不得不補習下功課,在RAC中症见,萬物皆信號喂走。...
    flowerflower閱讀 4,949評論 19 18
  • 前言 之前對RAC有了一個基本的認識,了解了它的作用谋作,以及RAC的運行機制芋肠,我們知道只要是信號(RACSignal...
    大大盆子閱讀 4,496評論 0 11
  • 1.ReactiveCocoa常見操作方法介紹。 1.1 ReactiveCocoa操作須知 所有的信號(RACS...
    F麥子閱讀 469評論 0 0