IOS響應式編程架構ReactiveCocoa(RAC)使用樣本,iosreactivecocoa

來源:互聯網
上載者:User

IOS響應式編程架構ReactiveCocoa(RAC)使用樣本,iosreactivecocoa

    ReactiveCocoa是響應式編程(FRP)在IOS中的一個實現架構,它的開源地址為:https://github.com/ReactiveCocoa/ReactiveCocoa# ;在網上看了幾篇文章,感覺理論講了很多,但是代碼還是看不太懂,於是自己把它github文檔上的一些使用的經典樣本實現了一下,項目中有需要時可以直接搬過去用,用的熟練了再讀源碼也比較容易理解。


    例1. 監聽對象的成員變數變化,當成員變數值被改變時,觸發做一些事情。

    這種情況其實就是IOS KVO機制使用的情境,使用KVO實現,通常有三個步驟:1,給對象的成員變數添加監聽;2,實現監聽回調;3,取消監聽;而通過RAC可以直接實現,RAC的回調是通過block實現的,類似於過程式編程,上下文也更容易理解一些。

    情境:當前類有一個成員變數 NSString *input,當它的值被改變時,發送一個請求。

    實現: 

[RACObserve(self, input)    subscribeNext:^(NSString* x){        request(x);//發送一個請求   }];

每次input值被修改時,就會調用此block,並且把修改後的值做為參數傳進來。

 

情境:在上面情境中,當使用者輸入的值以2開頭時,才發請求.

實現:

[[RACObserve(self, input)     filter:^(NSString* value){         if ([value hasPrefix:@"2"]) {             return YES;         } else {             return NO;         }     }]     subscribeNext:^(NSString* x){        request(x);//發送一個請求    }];

情境:上面情境是監聽自己的成員變數,如果想監聽UITextField輸入值變化,架構也做了封裝可以代替系統回調

實現:

[[self.priceInput.rac_textSignal     filter:^(NSString *str) {         if (str.integerValue > 20) {             return YES;         } else {             return NO;         }     }]     subscribeNext:^(NSString *str) {<span style="white-space:pre"></span>request(x);//發送一個請求
}];

例2. 同時監聽多個變數變化,當這些變數滿足一定條件時,使button為可點擊狀態

情境:button監聽 兩個輸入框有值和一個成員變數值,當輸入框有輸入且成員變數為真時,button為可點擊狀態

實現:

 

RAC(self.payButton,enabled) = [RACSignal                                   combineLatest:@[self.priceInput.rac_textSignal,                                                self.nameInput.rac_textSignal,                                                RACObserve(self, isConnected)                                                ]                                   reduce:^(NSString *price, NSString *name, NSNumber *connect){                                   return @(price.length > 0 && name.length > 0 && [connect boolValue]);                                   }];

情境:滿足上麵條件時,直接發送請求

實現:

[[RACSignal                                   combineLatest:@[self.priceInput.rac_textSignal,                                                self.nameInput.rac_textSignal,                                                RACObserve(self, isConnected)                                                ]                                   reduce:^(NSString *price, NSString *name, NSNumber *connect){                                   return @(price.length > 0 && name.length > 0 && ![connect boolValue]);                                   }]                             subscribeNext:^(NSNumber *res){                                 if ([res boolValue]) {                                     NSLog(@"XXXXX send request");                                 }                             }];

例3. 類似於產生產-消費

情境:使用者每次在TextField中輸入一個字元,1秒內沒有其它輸入時,去發一個請求。TextField中字元改變觸發事件已在例1中展示,這裡實現一下它觸法的方法,把1秒延時在此方法中實現。

實現:

- (void)showLoading {    [self.loadingDispose dispose];//上次訊號還沒處理,取消它(距離上次產生還不到1秒)    @weakify(self);    self.loadingDispose = [[[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {        [subscriber sendCompleted];        return nil;    }] delay:1] //延時一秒    subscribeCompleted:^{        @strongify(self);        doRequest();        self.loadingDispose = nil;    }];}

上面代碼看起來挻費解,不過下面一段類似的代碼拆開寫的,會比較容易理解:

[self.loadingDispose dispose];        RACSignal *loggingSignal = [RACSignal createSignal:^ RACDisposable * (id<RACSubscriber> subscriber) {//BLOCK_1        subscriptions++;        [subscriber sendNext:@"mytest"];        [subscriber sendCompleted];        return nil;    }];        loggingSignal = [loggingSignal delay:10];        self.loadingDispose = [loggingSignal subscribeNext:^(NSString* x){//BLOCK_2        NSLog(@"%@",x);        NSLog(@"subscription %u", subscriptions);    }];        self.loadingDispose = [loggingSignal subscribeCompleted:^{//BLOCK_3        NSLog(@"subscription %u", subscriptions);    }];

loggingSignal在每次被調用subscriibeNext:^(id x)或subscribeCompleted:^方法時(12行和17行),它建立進傳進的參數block_1就會被觸動發,而block_1中的sendNext:方法會調用subscriibeNext:^中對應的block_2, 而block_1中的sendCompleted會調用subscribeCompleted:中對應的block_3





聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.