RACCommand在項(xiàng)目中的實(shí)戰(zhàn)運(yùn)用和理解


title: RACCommand在項(xiàng)目中的實(shí)戰(zhàn)運(yùn)用和理解

date: 2016-08-09

categories: iOS

tags:

    -ReactiveCocoa

{% cq %}

RACCommand作為RAC比較重要的一個(gè)部分,其作用就是得到信號(hào)指令觸發(fā)動(dòng)作執(zhí)行,一般涉及到UI交互操作.那在項(xiàng)目里我們要怎樣巧妙的使用這個(gè)利器呢?

{% endcq %}

RACCommand的你需要了解的

兩種創(chuàng)建方式

#1
_orderCreatCommand = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
    
    return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        
        
        return nil;
    }];
}];

#2    
RACSignal *isEnableSignal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
    return nil;
}];
_orderCreatCommand = [[RACCommand alloc] initWithEnabled:isEnableSignal signalBlock:^RACSignal *(id input) {
    
    return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        
        
        return nil;
    }];
}];

屬性和方法的解析

調(diào)用執(zhí)行成功返回信號(hào)的信號(hào),主線程執(zhí)行

@property (nonatomic, strong, readonly) RACSignal *executionSignals;

調(diào)用執(zhí)行當(dāng)前信號(hào)是否正在執(zhí)行返回@(NO),主線程執(zhí)行

@property (nonatomic, strong, readonly) RACSignal *executing;

默認(rèn)情況下返回@NO信號(hào),但只有一下兩種情況會(huì)返回@YES 1.上面第二種創(chuàng)建RACCommand的時(shí)候就給isEnableSignal賦值為@YES的時(shí)候 2.allowsConcurrentExecution屬性設(shè)置為 NO并且這個(gè)信號(hào)正在執(zhí)行中. 主線程執(zhí)行

@property (nonatomic, strong, readonly) RACSignal *enabled;

是否允許多個(gè)RACCommand同時(shí)執(zhí)行髓棋。

@property (atomic, assign) BOOL allowsConcurrentExecution;

執(zhí)行RACCommand的時(shí)候發(fā)送獲取的error信號(hào)

@property (nonatomic, strong, readonly) RACSignal *errors;

調(diào)用RACCommand藕赞,input為executionSignals的訂閱者發(fā)送的值

- (RACSignal *)execute:(id)input;

開(kāi)始著手項(xiàng)目實(shí)戰(zhàn)

項(xiàng)目功能需求講解一:

某訂單確認(rèn)頁(yè)面


images

點(diǎn)擊提交訂單按鈕

在VC中代碼:

這里訂閱從ViewModel返回的最終信號(hào)

//點(diǎn)擊提交訂單
[[self.commitOrderButton rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) {
    STRONG
    [[self.confirmOrderViewModel.orderCreatCommand execute:finalParames]
     subscribeNext:^(NSDictionary *x) {
         
        self.commitOrderButton.enabled = YES;
        if ([self.confirmOrderViewModel.payWay isEqualToString:pay_downLine]{
            //貨到付款處理... 
        } else {
            //在線支付處理...         
        }
    } error:^(NSError *error) {
        [SVProgressHUD showErrorWithStatus:@"網(wǎng)絡(luò)錯(cuò)誤~"];
    }];
    
}];

在ViewModel中代碼:

創(chuàng)建command,在input獲取從VC中調(diào)用的execute傳來(lái)的參數(shù),返回一個(gè)信號(hào).信號(hào)包裹著提交訂單網(wǎng)絡(luò)請(qǐng)求的數(shù)據(jù)返回給下一個(gè)訂閱著.

- (RACCommand *)orderCreatCommand{

    _orderCreatCommand = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(NSMutableDictionary *params) {
        
        return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
            [SVProgressHUD showWithStatus:@"提交訂單..."];
            [XNBaseRequest HTTPPostWithUrl:URL_SX(XNRequestOrderCreat)
                                   Parames:parames
                                 commplete:^(id result) {
                                 
                                         [subscriber sendNext:payDict];
                                     });
                                 }
                                   failure:^(NSError *error) {
                                       [subscriber sendError:error];
                                   }];
            
            return nil;
        }];
        
    }];

    return _orderCreatCommand;
}

項(xiàng)目功能需求講解二:

某訂單支付頁(yè)面


images

點(diǎn)擊確認(rèn)支付按鈕

同樣獲取按鈕點(diǎn)擊事件做你想做的事

 [[self.CheckStandViewModel.payCommand execute:@"1"] subscribeNext:^(NSNumber    *isSuccess) {
                                                                                self.CheckStandViewModel.isOrderSuccess = isSuccess.boolValue;
} error:^(NSError *error) {
        [SVProgressHUD showErrorWithStatus:@"網(wǎng)絡(luò)錯(cuò)誤~"];
    }];

同樣在ViewModel里創(chuàng)建Command

... 你可以做你想自己的數(shù)據(jù)處理,在這我都不展示了

   - (RACCommand *)payCommand{
    WEAK
    _payCommand = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(NSString  *payType) {
        
        return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
        STRONG
            [SVProgressHUD showWithStatus:@"前往支付..."];
             ...
            [XNBaseRequest HTTPPostWithUrl:url
                                      Parames:parames
                                    commplete:^(id result) {
                                        
                                        ... 
                            [subscriber sendNext:@(NO)];
                            [subscriber sendCompleted];
                                                                                                                    failure:^(NSError *error) {
            
                                        [subscriber sendError:error];
                                    
                                      }];
            
            return nil;
        }];
    }];
    
    return _payCommand;
}

總結(jié)

在RAC中萬(wàn)物皆信號(hào),所以你需要更多的去理解信號(hào)作為一種流的方式存在.還有更多RACCommand方法等待你的發(fā)現(xiàn),至于如何更好的利用這個(gè)利器,相信你也有幾分的了解了,接下來(lái)的就需要自己不斷的摸索更多神奇而又強(qiáng)大的方法了.

文獻(xiàn)參考

RACCommand英文文檔

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末月匣,一起剝皮案震驚了整個(gè)濱河市于购,隨后出現(xiàn)的幾起案子顾彰,更是在濱河造成了極大的恐慌第美,老刑警劉巖橙喘,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件耙替,死亡現(xiàn)場(chǎng)離奇詭異亚侠,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)俗扇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門(mén)硝烂,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人铜幽,你說(shuō)我怎么就攤上這事滞谢。” “怎么了除抛?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵狮杨,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我到忽,道長(zhǎng)橄教,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮护蝶,結(jié)果婚禮上华烟,老公的妹妹穿的比我還像新娘。我一直安慰自己持灰,他們只是感情好垦江,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著搅方,像睡著了一般比吭。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上姨涡,一...
    開(kāi)封第一講書(shū)人閱讀 51,763評(píng)論 1 307
  • 那天衩藤,我揣著相機(jī)與錄音,去河邊找鬼涛漂。 笑死赏表,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的匈仗。 我是一名探鬼主播瓢剿,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼悠轩!你這毒婦竟也來(lái)了间狂?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤火架,失蹤者是張志新(化名)和其女友劉穎鉴象,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體何鸡,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡纺弊,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了骡男。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片淆游。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖隔盛,靈堂內(nèi)的尸體忽然破棺而出犹菱,到底是詐尸還是另有隱情,我是刑警寧澤骚亿,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布已亥,位于F島的核電站,受9級(jí)特大地震影響来屠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一俱笛、第九天 我趴在偏房一處隱蔽的房頂上張望捆姜。 院中可真熱鬧,春花似錦迎膜、人聲如沸泥技。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)珊豹。三九已至,卻和暖如春榕订,著一層夾襖步出監(jiān)牢的瞬間店茶,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工劫恒, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留贩幻,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓两嘴,卻偏偏與公主長(zhǎng)得像丛楚,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子憔辫,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

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

  • RAC使用測(cè)試Demo下載:github.com/FuWees/WPRACTestDemo 1.ReactiveC...
    FuWees閱讀 6,372評(píng)論 3 10
  • 打算在項(xiàng)目中大面積使用RAC來(lái)開(kāi)發(fā)趣些,所以整理一些常用的實(shí)踐范例和比較完整的api說(shuō)明方便開(kāi)發(fā)時(shí)隨時(shí)查閱 聲明式編程...
    星光社的戴銘閱讀 5,352評(píng)論 5 49
  • 標(biāo)簽: iOS RAC 概述 ReactiveCocoa是一個(gè)函數(shù)響應(yīng)式編程框架,它能讓我們脫離Cocoa AP...
    GodyZ閱讀 7,534評(píng)論 16 97
  • 項(xiàng)目連接 前言 本項(xiàng)目的數(shù)據(jù)為抓包所得贰您,并且都是用的本地?cái)?shù)據(jù)喧务,只作為學(xué)習(xí)用途。項(xiàng)目中所用到的appKey枉圃,為了方便...
    逆流丶而上閱讀 19,128評(píng)論 54 236
  • 如果你沒(méi)有過(guò) 深夜里壓低聲音痛哭功茴, 你肯定不懂她的委屈和隱忍 如果你沒(méi)有過(guò), 在陌生人群中 淚水就那樣忍不住的滑落...
    M安吶閱讀 543評(píng)論 1 3