ReactiveCocoa(RAC)框架

簡(jiǎn)介

什么是RAC?ReactiveCocoa(簡(jiǎn)稱RAC),是由Github開源的一個(gè)應(yīng)用于iOS和OS開發(fā)的新框架,Cocoa是蘋果整套框架的簡(jiǎn)稱,因此很多蘋果框架喜歡以Cocoa結(jié)尾如蚜。借用RayWenderlich上面的話:

As an iOS developer, nearly every line of code you write is in reaction to some event; a button tap, a received network message, a property change (via Key Value Observing) or a change in user’s location via CoreLocation are all good examples. However, these events are all encoded in different ways; as actions, delegates, KVO, callbacks and others. ReactiveCocoa defines a standard interface for events, so they can be more easily chained, filtered and composed using a basic set of tools.

翻譯過來就是:

作為一個(gè)iOS開發(fā)者或辖,你寫的每一行代碼幾乎都是在響應(yīng)某個(gè)事件,例如按鈕的點(diǎn)擊穗椅,收到網(wǎng)絡(luò)消息使鹅,屬性的變化(通過KVO)或者用戶位置的變化(通過CoreLocation)
挫鸽。但是這些事件都用不同的方式來處理昧碉,比如action、delegate诗赌、KVO汗茄、callback等
。ReactiveCocoa為事件定義了一個(gè)標(biāo)準(zhǔn)接口境肾,從而可以使用一些基本工具來更容易的連接剔难、過濾和組合。

RAC是由Matt Thompson大神開發(fā)的,很多開發(fā)者對(duì)其的評(píng)價(jià)是開啟一個(gè)新的Objective-C紀(jì)元奥喻。

安裝

ReactiveCocoa用pod安裝即可偶宫。
本文的Demo可在文章最后下載,在閱讀本文的時(shí)候,強(qiáng)烈推薦邊看Demo邊看博文。
項(xiàng)目中加入了ReactiveCocoa和DeveloperLx的打印插件LxDBAnything同時(shí)加入了鍵盤相應(yīng)的第三方IQKeyboardManager,以及Masonry,使用方法可以看這篇文章:iOS – Masonry自動(dòng)布局(Autolayout)环鲤。

代碼

第一部分 簡(jiǎn)單使用

文本框事件

原來我們?cè)谑褂胻extFiled的時(shí)候我們需要寫到

[textField addTarget:self action:@selector(textChanged:) forControlEvents:UIControlEventEditingChanged];

然后實(shí)現(xiàn)textChanged:方法,在RAC中,對(duì)于文本框的監(jiān)聽,是非常簡(jiǎn)單的一件事情,看如下代碼:

UITextField * textField = ({
       UITextField * textField = [[UITextField alloc]init];
       textField.backgroundColor = [UIColor cyanColor];
       
       textField;
   });
  [self.view addSubview:textField];
   
   @weakify(self); //  __weak __typeof__(self) self_weak_ = self;
   
   [textField mas_makeConstraints:^(MASConstraintMaker *make) {
       
       @strongify(self);    // __strong __typeof__(self) self = self_weak_;
       make.size.mas_equalTo(CGSizeMake(180, 40));
       make.center.equalTo(self.view);
   }];
   
   [[textField rac_signalForControlEvents:UIControlEventEditingChanged]
    subscribeNext:^(id x) {
        
        LxDBAnyVar(x);
    }];
   [textField.rac_textSignal subscribeNext:^(NSString *x) {
       
       LxDBAnyVar(x);
   }];

打印結(jié)果:

??__31-[ViewController textFiledTest]_block_invoke_2 + 215?? x = 12
??__31-[ViewController textFiledTest]_block_invoke241 + 211?? x = 0x7fe810c51a90; frame = (97.5 313.5; 180 40); text = '123'; clipsToBounds = YES; opaque = NO; gestureRecognizers = 0x7fe810f58fb0>; layer = 0x7fe810c51600>>
??__31-[ViewController textFiledTest]_block_invoke_2 + 215?? x = 123
??__31-[ViewController textFiledTest]_block_invoke241 + 211?? x = 0x7fe810c51a90; frame = (97.5 313.5; 180 40); text = '1231'; clipsToBounds = YES; opaque = NO; gestureRecognizers = 0x7fe810f58fb0>; layer = 0x7fe810c51600>>
??__31-[ViewController textFiledTest]_block_invoke_2 + 215?? x = 1231
??__31-[ViewController textFiledTest]_block_invoke241 + 211?? x = 0x7fe810c51a90; frame = (97.5 313.5; 180 40); text = '12312'; clipsToBounds = YES; opaque = NO; gestureRecognizers = 0x7fe810f58fb0>; layer = 0x7fe810c51600>>
??__31-[ViewController textFiledTest]_block_invoke_2 + 215?? x = 12312
??__31-[ViewController textFiledTest]_block_invoke241 + 211?? x = 0x7fe810c51a90; frame = (97.5 313.5; 180 40); text = '123123'; clipsToBounds = YES; opaque = NO; gestureRecognizers = 0x7fe810f58fb0>; layer = 0x7fe810c51600>>
??__31-[ViewController textFiledTest]_block_invoke_2 + 215?? x = 123123

我們很容易的監(jiān)聽到textFiled中發(fā)生的變化,其中x的類型默認(rèn)為id類型,我們已知它的類型的時(shí)候我們可以將其改變,就像上面代碼,將id改成NSString類型纯趋。

手勢(shì)

self.view.userInteractionEnabled = YES;
    UITapGestureRecognizer * tap = [[UITapGestureRecognizer alloc]init];
    [[tap rac_gestureSignal] subscribeNext:^(UITapGestureRecognizer * tap) {
        
        LxDBAnyVar(tap);
    }];
    [self.view addGestureRecognizer:tap];

為了方便,我們直接添加到self.view上,點(diǎn)擊屏幕,得到打印結(jié)果:

??__29-[ViewController gestureTest]_block_invoke + 184?? tap = 0x7fa2e3e1f9f0; state = Ended; view = 0x7fa2e3e20b70>; target= action=sendNext:, target=0x7fa2e3c064f0>)>>

通知

[[[NSNotificationCenter defaultCenter] rac_addObserverForName:UIApplicationDidEnterBackgroundNotification object:nil] subscribeNext:^(NSNotification * notification) {
       
       LxDBAnyVar(notification);
   }];

我們建立了一個(gè)通知,叫做進(jìn)入后臺(tái),當(dāng)程序進(jìn)入后臺(tái)的時(shí)候通知相應(yīng),當(dāng)我們用RAC寫通知的時(shí)候,我們有一個(gè)好處,就是不用removeObserve通知,因?yàn)镽AC通知的監(jiān)聽者是RAC自己,它會(huì)幫你管理釋放方法±淅耄可以看方法實(shí)現(xiàn)如下:

- (RACSignal *)rac_addObserverForName:(NSString *)notificationName object:(id)object {
    @unsafeify(object);
    return [[RACSignal createSignal:^(idRACSubscriber> subscriber) {
        @strongify(object);
        id observer = [self addObserverForName:notificationName object:object queue:nil usingBlock:^(NSNotification *note) {
            [subscriber sendNext:note];
        }];

        return [RACDisposable disposableWithBlock:^{
            [self removeObserver:observer];
        }];
    }] setNameWithFormat:@"-rac_addObserverForName: %@ object: ", notificationName, [object class], object];
}

定時(shí)器

//1. 延遲某個(gè)時(shí)間后再做某件事
[[RACScheduler mainThreadScheduler]afterDelay:2 schedule:^{
    
    LxPrintAnything(rac);
}];

//2. 每間隔多長(zhǎng)時(shí)間做一件事
[[RACSignal interval:1 onScheduler:[RACScheduler mainThreadScheduler]]subscribeNext:^(NSDate * date) {
    
    LxDBAnyVar(date);
}];

這是定時(shí)器最常用的兩種寫法,第一種方法,延遲時(shí)間去做某件事情,更改afterDelay的屬性吵冒。
第二種方法,每間隔多長(zhǎng)時(shí)間做一件事情,更改interval屬性。

代理

UIAlertView * alertView = [[UIAlertView alloc]initWithTitle:@"RAC" message:@"ReactiveCocoa" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"Ensure", nil];
   
   [[self rac_signalForSelector:@selector(alertView:clickedButtonAtIndex:) fromProtocol:@protocol(UIAlertViewDelegate)] subscribeNext:^(RACTuple * tuple) {
       
       LxDBAnyVar(tuple);
       
       LxDBAnyVar(tuple.first);
       LxDBAnyVar(tuple.second);
       LxDBAnyVar(tuple.third);
   }];
   [alertView show];
   
   
   //   更簡(jiǎn)單的方式:
   [[alertView rac_buttonClickedSignal]subscribeNext:^(id x) {
       
       LxDBAnyVar(x);
   }];

用RAC去寫代理的時(shí)候,會(huì)有局限,只能取代沒有返回值的代理方法,什么是沒有返回值的代理呢?比如說tableView的代理方法:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末西剥,一起剝皮案震驚了整個(gè)濱河市痹栖,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌瞭空,老刑警劉巖揪阿,帶你破解...
    沈念sama閱讀 217,542評(píng)論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異咆畏,居然都是意外死亡南捂,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評(píng)論 3 394
  • 文/潘曉璐 我一進(jìn)店門旧找,熙熙樓的掌柜王于貴愁眉苦臉地迎上來溺健,“玉大人,你說我怎么就攤上這事钮蛛”掮裕” “怎么了剖膳?”我有些...
    開封第一講書人閱讀 163,912評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)岭辣。 經(jīng)常有香客問我潮秘,道長(zhǎng),這世上最難降的妖魔是什么易结? 我笑而不...
    開封第一講書人閱讀 58,449評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮柜候,結(jié)果婚禮上搞动,老公的妹妹穿的比我還像新娘。我一直安慰自己渣刷,他們只是感情好鹦肿,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,500評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著辅柴,像睡著了一般箩溃。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上碌嘀,一...
    開封第一講書人閱讀 51,370評(píng)論 1 302
  • 那天涣旨,我揣著相機(jī)與錄音,去河邊找鬼股冗。 笑死霹陡,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的止状。 我是一名探鬼主播烹棉,決...
    沈念sama閱讀 40,193評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼怯疤!你這毒婦竟也來了浆洗?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤集峦,失蹤者是張志新(化名)和其女友劉穎伏社,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體少梁,經(jīng)...
    沈念sama閱讀 45,505評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡洛口,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,722評(píng)論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了凯沪。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片第焰。...
    茶點(diǎn)故事閱讀 39,841評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖妨马,靈堂內(nèi)的尸體忽然破棺而出挺举,到底是詐尸還是另有隱情杀赢,我是刑警寧澤,帶...
    沈念sama閱讀 35,569評(píng)論 5 345
  • 正文 年R本政府宣布湘纵,位于F島的核電站脂崔,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏梧喷。R本人自食惡果不足惜砌左,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,168評(píng)論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望铺敌。 院中可真熱鬧汇歹,春花似錦、人聲如沸偿凭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽弯囊。三九已至痰哨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間匾嘱,已是汗流浹背斤斧。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評(píng)論 1 269
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留奄毡,地道東北人折欠。 一個(gè)月前我還...
    沈念sama閱讀 47,962評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像吼过,于是被迫代替她去往敵國(guó)和親锐秦。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,781評(píng)論 2 354

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