ReactiveCocoa

ReactiveCocoa(其簡稱為RAC)是由Github開源的一個應(yīng)用于iOS和OS X開發(fā)的新框架掀抹。

ReactiveCocoa簡介

ReactiveCocoa是個注重結(jié)果的框架移国。先簡單說一嘴響應(yīng)式編程思想(Reactive Programming) 场晶,你調(diào)用的順序不需要考慮,因為你做任何的操作一定會對結(jié)果產(chǎn)生影響秒梅。然后就是函數(shù)式編程思想(Functional Programming)铐伴,把代碼高聚合起來寫成一系列嵌套的函數(shù)或者方法調(diào)用。所以ReactiveCocoa又稱之為函數(shù)響應(yīng)式編程(FRP)框架隅要。

RAC中的類解析

RACSiganl是個信號類,他初始化后需要Subscriber(訂閱者)去訂閱這個信號,如果沒有訂閱那么這個信號就是個冷信號董济,訂閱過就是熱信號步清。Signal可以被修改(map),過濾(filter)虏肾,聚合(combine)廓啊,串聯(lián)(chain)。RACSignal類初始化方法如下:

RACSignal *siganl = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
   
    NSLog(@"調(diào)用此block");

    [subscriber sendNext:@1];
    
    [subscriber sendCompleted];
    
    return [RACDisposable disposableWithBlock:^{
       
        // 執(zhí)行完Block后封豪,當(dāng)前信號就不在被訂閱了崖瞭。
        
        NSLog(@"信號被銷毀");
        
    }];
}];
//訂閱信號,才會激活信號變成熱信號。
[siganl subscribeNext:^(id x) {
    NSLog(@"接收到數(shù)據(jù):%@",x);
}];
[siganl subscribeNext:^(id x) {
    NSLog(@"再次收到數(shù)據(jù):%@",x);
}];
執(zhí)行結(jié)果

可以看出來訂閱一次信號就會先調(diào)用信號源一次撑毛。


寫個登陸的demo:
需求:用戶名,密碼欄長度大于3,如果沒有大于3兩個控件背景顏色是黃色的而按鈕是不可點(diǎn)擊并且是灰色的藻雌。
1.首先把控件都寫好(用戶名雌续,密碼,登陸按鈕)2個textField 1個button

//用戶名信號
RACSignal *validUsernameSignal = [self.usernameTextField.rac_textSignal map:^id(NSString *text) {
    return @(text.length>3);
}];
[[self.usernameTextField.rac_textSignal
  filter:^BOOL(id value) {
      NSString *text = value;
      return text.length > 3;
  }]
 subscribeNext:^(id x) {
     //符合條件后執(zhí)行(即獲得用戶名)
     NSLog(@"用戶名%@", x);
 }];
     //監(jiān)聽密碼信號
RACSignal *validPasswordSignal = [self.passwordTextField.rac_textSignal map:^id(NSString *text) {
    return @(text.length>3);
}];
    //監(jiān)聽validUsernameSignal(用戶名信號)返回值來改變用戶名背景色
RAC(self.usernameTextField,backgroundColor) = [validUsernameSignal map:^id(NSNumber *passwordValid) {
    return [passwordValid boolValue] ? [UIColor clearColor] : [UIColor yellowColor];
}];
   //同上
RAC(self.passwordTextField,backgroundColor) = [validPasswordSignal map:^id(NSNumber *passwordValid) {
    return [passwordValid boolValue] ? [UIColor clearColor] : [UIColor yellowColor];
}];
    //聯(lián)合用戶名和密碼信號
RACSignal *signUpActiveSignal = [RACSignal combineLatest:@[validPasswordSignal,validUsernameSignal]
                                 reduce:^id(NSNumber *usernameValid, NSNumber *passwordValid){
                                      return @([usernameValid boolValue] && [passwordValid boolValue]);
                                 }];
    //監(jiān)聽聯(lián)合的信號并改變按鈕的顏色
[signUpActiveSignal subscribeNext:^(NSNumber *signupActive) {
    self.signInButton.enabled = [signupActive boolValue];
}];
    //監(jiān)聽按鈕的輕拍
   [[[[self.signInButton rac_signalForControlEvents:UIControlEventTouchUpInside]
   //執(zhí)行Next之前胯杭,會先執(zhí)行這個doNext的Block
   doNext:^(id x) {
       self.signInButton.enabled = NO;
   }]
  //和map相比它的返回值是信號
flattenMap:^id(id x) {
    return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
   //這個方法就是將文本框文字傳進(jìn)去看看是否匹配對應(yīng)的用戶名和密碼 這個方法后面還有個帶有BOOL參數(shù)的block驯杜,這個參數(shù)就是是否正確匹配用戶名和密碼 ,
        [self.signInService
         signInWithUsername:self.usernameTextField.text
         password:self.passwordTextField.text
         complete:^(BOOL success) {
  //訂閱者將這個布爾值發(fā)送出去做个,下面的subscribeNext方法就會收到這個參數(shù)并做一系列的處理(跳進(jìn)下個頁面)
             [subscriber sendNext:@(success)];
             [subscriber sendCompleted];
         }];
        return nil;
    }];;
}]
subscribeNext:^(NSNumber *signedIn) {
    self.signInButton.enabled = YES;
    BOOL success = [signedIn boolValue];
    if (success) {
    //進(jìn)入下個頁面
        [self performSegueWithIdentifier:@"signinsuccess" sender:self];
    }
}];
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末鸽心,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子居暖,更是在濱河造成了極大的恐慌顽频,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,695評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件太闺,死亡現(xiàn)場離奇詭異糯景,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)省骂,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評論 3 399
  • 文/潘曉璐 我一進(jìn)店門蟀淮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人钞澳,你說我怎么就攤上這事怠惶。” “怎么了轧粟?”我有些...
    開封第一講書人閱讀 168,130評論 0 360
  • 文/不壞的土叔 我叫張陵策治,是天一觀的道長。 經(jīng)常有香客問我逃延,道長览妖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,648評論 1 297
  • 正文 為了忘掉前任揽祥,我火速辦了婚禮讽膏,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘拄丰。我一直安慰自己府树,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評論 6 397
  • 文/花漫 我一把揭開白布料按。 她就那樣靜靜地躺著奄侠,像睡著了一般。 火紅的嫁衣襯著肌膚如雪载矿。 梳的紋絲不亂的頭發(fā)上垄潮,一...
    開封第一講書人閱讀 52,268評論 1 309
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼弯洗。 笑死旅急,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的牡整。 我是一名探鬼主播藐吮,決...
    沈念sama閱讀 40,835評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼逃贝!你這毒婦竟也來了谣辞?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,740評論 0 276
  • 序言:老撾萬榮一對情侶失蹤沐扳,失蹤者是張志新(化名)和其女友劉穎泥从,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體迫皱,經(jīng)...
    沈念sama閱讀 46,286評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡歉闰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了卓起。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片和敬。...
    茶點(diǎn)故事閱讀 40,505評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖戏阅,靈堂內(nèi)的尸體忽然破棺而出昼弟,到底是詐尸還是另有隱情,我是刑警寧澤奕筐,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布舱痘,位于F島的核電站,受9級特大地震影響离赫,放射性物質(zhì)發(fā)生泄漏芭逝。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評論 3 333
  • 文/蒙蒙 一渊胸、第九天 我趴在偏房一處隱蔽的房頂上張望旬盯。 院中可真熱鬧,春花似錦翎猛、人聲如沸胖翰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,357評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽萨咳。三九已至,卻和暖如春疫稿,著一層夾襖步出監(jiān)牢的瞬間培他,已是汗流浹背鹃两。 一陣腳步聲響...
    開封第一講書人閱讀 33,466評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留靶壮,地道東北人怔毛。 一個月前我還...
    沈念sama閱讀 48,921評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像腾降,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子碎绎,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評論 2 359

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