ReactiveCocoa小結(jié)

1. 監(jiān)聽 KVO
  • 1.1> 監(jiān)聽對象的屬性變化
[RACObserve(self.scrollView, contentSize) subscribeNext:^(id x) { 
}];
  • 1.2> 監(jiān)聽Bool值改變
[RACObserve(self, bCheck) subscribeNext:^(id x) { 
}];
  • 1.3> 監(jiān)聽方法
監(jiān)聽某個方法被調(diào)用會觸發(fā)
[[self rac_signalForSelector:@selector(viewDidAppear:)] subscribeNext:^(id x) {
}];
可以指定某個代理中的方法
[[self rac_signalForSelector:@selector(alertView:clickedButtonAtIndex:) fromProtocol:@protocol(UIAlertViewDelegate)] subscribeNext:^(RACTuple *tuple) {
}];
監(jiān)聽UITextField變化
[textField.rac_textSignal subscribeNext:^(NSString *text) {
  //文本輸入變化
}];
[[textField rac_signalForControlEvents:UIControlEventEditingChanged] subscribeNext:^(id x) {
  //文本輸入變化
}]; 
[[textField rac_signalForControlEvents:UIControlEventEditingDidEnd] subscribeNext:^(id x) {
   //結(jié)束編輯
}];
RACObserve監(jiān)聽的對象屬性返回值作為RAC監(jiān)聽對象屬性的值
RAC(customBtn, hidden) = RACObserve(textField, hidden); 
等價于: 
[RACObserve(textField, hidden) subscribeNext:^(BOOL x) { 
customBtn.hidden = x; 
}]
2.事件
  • 2.1> 按鈕點擊事件
[[submitBtn rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) { 
}];
  • 2.2> 手勢事件
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] init]; 
[[cancelTap rac_gestureSignal] subscribeNext:^(id x) { 
}];
3.通知
[[[NSNotificationCenter defaultCenter] rac_addObserverForName:@"postData" object:nil] subscribeNext:^(NSNotification *notification) {
}];
4.替代代理 回調(diào)類似于block用法
信號創(chuàng)建
RACSubject * moreSignal = [RACSubject subject];
信號發(fā)送
[moreSignal sendNext:];
信號響應(yīng)
[moreSignal subscribeNext:^(id x) {
}];
5.映射
map函數(shù)就是創(chuàng)建一個訂閱者的映射并且返回數(shù)據(jù)屈雄,RAC監(jiān)聽對象屬性的值徘郭,也就是customLabel.text根據(jù)textField的值來賦值社付,value的類型根據(jù)target監(jiān)聽屬性值來定義
eg:textField的text是NSString類型. map函數(shù)需要返回值慨菱,類型必須和等號左邊的RAC的接受值一致挟炬,如果返回BOOL則crash

RAC(customLabel, text) = [textField.rac_textSignal   map:^id(NSString *value) {
  return value;
}];
[[textFild.rac_textSignal map:^id(id value) {
       return @1;
}] subscribeNext:^(id x) {
       NSLog(@"%@", x);    //輸出1鸥滨,這個x是上面block中return返回值1
}];
6.過濾
  • 6.1> filter 可以幫助你篩選出你需要的值
[[self.textFild.rac_textSignal filter:^BOOL(NSString *value) {
     return [value length] > 3;
 }] subscribeNext:^(id x) {
     NSLog(@"x = %@", x);
}];
  • 6.2> ignore 可以忽略某些值
[[self.textFild.rac_textSignal filter:^BOOL(NSString *value) {
     return [value length] > 3;
 }] subscribeNext:^(id x) {
     NSLog(@"x = %@", x);
}];
  • 6.3> take 從開始一共取幾次信號. 從頭
RACSubject * subject = [RACSubject subject];
[[subject take:2] subscribeNext:^(id x) {
   NSLog(@"%@",x); // 1 2
}];
[subject sendNext:@"1"];
[subject sendNext:@"2"];
[subject sendNext:@"3"];
  • 6.4> takeLast 取后面的值 必須是發(fā)送完成
RACSubject * subject = [RACSubject subject];
[[subject takeLast:2] subscribeNext:^(id x) {
    NSLog(@"%@",x); // 2 3
}];
[subject sendNext:@"1"];
[subject sendNext:@"2"];
[subject sendNext:@"3"];
[subject sendCompleted];
  • 6.5> takeUntil 當(dāng)傳入的某個信號發(fā)送完成嗦哆,這樣就不會再接收源信號的內(nèi)容,或者發(fā)送任意數(shù)據(jù)也不會再接收
RACSubject * subject = [RACSubject subject];
RACSubject * signal = [RACSubject subject];
[[subject takeUntil:signal] subscribeNext:^(id x) {
    NSLog(@"%@",x); //1 2
}];
[subject sendNext:@"1"];
[subject sendNext:@"2"];
[signal sendCompleted];
[subject sendNext:@"3"];
  • 6.6> distinctUntilChanged 如果當(dāng)前的值跟上一個值相同婿滓,這樣就不會被訂閱發(fā)送信號
RACSubject * subject = [RACSubject subject];
[[subject distinctUntilChanged] subscribeNext:^(id x) {
    NSLog(@"%@",x); //A
}];
[subject sendNext:@"A"];
[subject sendNext:@"A"];
7.RACMulticastConnection

當(dāng)我們多次訂閱同一個信號的時候老速,避免訂閱信號block中的代碼被調(diào)用多次。

RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id subscriber) {
  return nil;
}];
RACMulticastConnection *connection = [signal publish];//轉(zhuǎn)化為連接類
[connection.signal subscribeNext:^(id x) {
}];
[connection.signal subscribeNext:^(id x) {
}];
[connection connect]; 
8.rac_liftSelector:withSignalsFromArray:

當(dāng)進(jìn)入一個頁面需要發(fā)多次請求凸主,當(dāng)全部請求結(jié)束再執(zhí)行更新UI橘券,可以使用下面RAC方法,可以替代多線程GCD的dispatch_group_enter和dispatch_group_leave 參數(shù)1:請求結(jié)束執(zhí)行的方法秕铛,參數(shù)個數(shù)必須是和參數(shù)二的數(shù)組信號個數(shù)一致约郁,是信號發(fā)送的值 參數(shù)2: 數(shù)組 存放所有信號

rac_liftSelector:withSignalsFromArray:
9.組合
  • 9.1> concat 數(shù)組組合
RACSequence *letters = [@"A B C D E F G H I" componentsSeparatedByString:@" "].rac_sequence;
RACSequence *numbers = [@"1 2 3 4 5 6 7 8 9" componentsSeparatedByString:@" "].rac_sequence;
RACSequence *concatenated = [letters concat:numbers];
[concatenated.signal subscribeNext:^(id x) {
    NSLog(@"%@",x); // Contains: A B C D E F G H I 1 2 3 4 5 6 7 8 9
}];
  • 9.2> merge 當(dāng)多個信號執(zhí)行同一種操作 使用merge
RACSubject *subject1 = [RACSubject subject];
RACSubject *subject2 = [RACSubject subject];
RACSignal *mergeSignal = [subject1 merge:subject2];
[mergeSignal subscribeNext:^(id x) {
    NSLog(@"%@",x);
}];
[subject1 sendNext:@"第一個位置調(diào)用"];
[subject1 sendNext:@"第二個位置調(diào)用"];
  • 9.3> zipWith 當(dāng)希望兩個信號都發(fā)出信號時才調(diào)用,并且會把兩個信號的內(nèi)容組成一個元組但两,和第8的作用非常一樣
RACSubject *subject1 = [RACSubject subject];
RACSubject *subject2 = [RACSubject subject];
RACSignal *mergeSignal = [subject1 zipWith:subject2];
[mergeSignal subscribeNext:^(id x) {
    NSLog(@"%@",x);
}];
[subject1 sendNext:@"第一個位置調(diào)用"];
[subject1 sendNext:@"第二個位置調(diào)用"];
  • 9.4> combineLatest 將多個信號合并起來鬓梅,當(dāng)希望兩個信號都發(fā)出信號時才調(diào)用,和9.3作用一樣
RACSubject *subject1 = [RACSubject subject];
RACSubject *subject2 = [RACSubject subject];
RACSignal *mergeSignal = [RACSignal combineLatest:@[subject1,subject2] reduce:^id(NSString * title1,NSString * title2){
    NSLog(@"%@ -- %@",title1,title2);  //第一個位置調(diào)用 -- 第二個位置調(diào)用
    return @"返回值";
}];
[mergeSignal subscribeNext:^(id x) {
    NSLog(@"%@",x);   //返回值
}];
[subject1 sendNext:@"第一個位置調(diào)用"];
[subject2 sendNext:@"第二個位置調(diào)用"];
  • 9.5> reduce reduce是聚合的作用谨湘,講多個信號分別發(fā)送的信號聚在一起返回绽快。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市紧阔,隨后出現(xiàn)的幾起案子坊罢,更是在濱河造成了極大的恐慌,老刑警劉巖擅耽,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件活孩,死亡現(xiàn)場離奇詭異,居然都是意外死亡乖仇,警方通過查閱死者的電腦和手機(jī)憾儒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來乃沙,“玉大人起趾,你說我怎么就攤上這事【澹” “怎么了训裆?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長蜀铲。 經(jīng)常有香客問我边琉,道長,這世上最難降的妖魔是什么蝙茶? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任艺骂,我火速辦了婚禮,結(jié)果婚禮上隆夯,老公的妹妹穿的比我還像新娘钳恕。我一直安慰自己别伏,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布忧额。 她就那樣靜靜地躺著厘肮,像睡著了一般。 火紅的嫁衣襯著肌膚如雪睦番。 梳的紋絲不亂的頭發(fā)上类茂,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天,我揣著相機(jī)與錄音托嚣,去河邊找鬼巩检。 笑死,一個胖子當(dāng)著我的面吹牛示启,可吹牛的內(nèi)容都是我干的兢哭。 我是一名探鬼主播,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼夫嗓,長吁一口氣:“原來是場噩夢啊……” “哼迟螺!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起舍咖,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤矩父,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后排霉,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體窍株,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年攻柠,在試婚紗的時候發(fā)現(xiàn)自己被綠了夹姥。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡辙诞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出轻抱,到底是詐尸還是另有隱情飞涂,我是刑警寧澤,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布祈搜,位于F島的核電站较店,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏容燕。R本人自食惡果不足惜梁呈,卻給世界環(huán)境...
    茶點故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望蘸秘。 院中可真熱鬧官卡,春花似錦蝗茁、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至毛秘,卻和暖如春饭寺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背叫挟。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工艰匙, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人抹恳。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓员凝,卻偏偏與公主長得像,于是被迫代替她去往敵國和親适秩。 傳聞我的和親對象是個殘疾皇子绊序,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,870評論 2 361

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

  • 一、介紹 ReactiveCocoa(簡稱RAC)是由GitHub團(tuán)隊開源的一套基于Cocoa的并且具有FRP特性...
    Janek_m閱讀 592評論 0 1
  • 1.ReactiveCocoa簡介 ReactiveCocoa(簡稱為RAC),是由Github開源的一個應(yīng)用于i...
    F麥子閱讀 638評論 0 0
  • 1.ReactiveCocoa常見操作方法介紹秽荞。 1.1 ReactiveCocoa操作須知 所有的信號(RACS...
    F麥子閱讀 490評論 0 0
  • 一骤公、常見類 1、RACSiganl 信號類扬跋。 RACEmptySignal :空信號阶捆,用來實現(xiàn) RACSignal...
    萌芽的冬天閱讀 240評論 0 2
  • 16宿命:用概率思維提高你的勝算 以前的我是風(fēng)險厭惡者,不喜歡去冒險钦听,但是人生放棄了冒險洒试,也就放棄了無數(shù)的可能。 ...
    yichen大刀閱讀 6,059評論 0 4