国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統(tǒng) > iOS > 正文

IOS響應(yīng)式編程框架ReactiveCocoa(RAC)使用示例

2019-11-09 18:55:27
字體:
供稿:網(wǎng)友

ReactiveCocoa是響應(yīng)式編程(FRP)在iOS中的一個(gè)實(shí)現(xiàn)框架,它的開源地址為:https://github.com/ReactiveCocoa/ReactiveCocoa# ;在網(wǎng)上看了幾篇文章,感覺理論講了很多,但是代碼還是看不太懂,于是自己把它github文檔上的一些使用的經(jīng)典示例實(shí)現(xiàn)了一下,項(xiàng)目中有需要時(shí)可以直接搬過去用,用的熟練了再讀源碼也比較容易理解。

    例1. 監(jiān)聽對(duì)象的成員變量變化,當(dāng)成員變量值被改變時(shí),觸發(fā)做一些事情。

    這種情況其實(shí)就是IOS KVO機(jī)制使用的場(chǎng)景,使用KVO實(shí)現(xiàn),通常有三個(gè)步驟:1,給對(duì)象的成員變量添加監(jiān)聽;2,實(shí)現(xiàn)監(jiān)聽回調(diào);3,取消監(jiān)聽;而通過RAC可以直接實(shí)現(xiàn),RAC的回調(diào)是通過block實(shí)現(xiàn)的,類似于過程式編程,上下文也更容易理解一些。

    場(chǎng)景:當(dāng)前類有一個(gè)成員變量 NSString *input,當(dāng)它的值被改變時(shí),發(fā)送一個(gè)請(qǐng)求。

    實(shí)現(xiàn): 

[objc] view plain copy 在CODE上查看代碼片[RACObserve(self, input)      subscribeNext:^(NSString* x){          request(x);//發(fā)送一個(gè)請(qǐng)求     }];  

每次input值被修改時(shí),就會(huì)調(diào)用此block,并且把修改后的值做為參數(shù)傳進(jìn)來。

 

場(chǎng)景:在上面場(chǎng)景中,當(dāng)用戶輸入的值以2開頭時(shí),才發(fā)請(qǐng)求.

實(shí)現(xiàn):

[objc] view%20plain copy [[RACObserve(self, input)       filter:^(NSString* value){           if ([value hasprefix:@"2"]) {               return YES;           } else {               return NO;           }       }]       subscribeNext:^(NSString* x){          request(x);//發(fā)送一個(gè)請(qǐng)求      }];  場(chǎng)景:上面場(chǎng)景是監(jiān)聽自己的成員變量,如果想監(jiān)聽UITextField輸入值變化,框架也做了封裝可以代替系統(tǒng)回調(diào)

實(shí)現(xiàn):

[objc] view%20plain copy [[self.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]);                                     }];  

場(chǎng)景:滿足上面條件時(shí),直接發(fā)送請(qǐng)求

實(shí)現(xiàn):

[objc] view%20plain copy [[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.%20類似于生成產(chǎn)-消費(fèi)

場(chǎng)景:用戶每次在TextField中輸入一個(gè)字符,1秒內(nèi)沒有其它輸入時(shí),去發(fā)一個(gè)請(qǐng)求。TextField中字符改變觸發(fā)事件已在例1中展示,這里實(shí)現(xiàn)一下它觸法的方法,把1秒延時(shí)在此方法中實(shí)現(xiàn)。

實(shí)現(xiàn):

[objc] view%20plain copy - (void)showLoading {        [self.loadingDispose dispose];//上次信號(hào)還沒處理,取消它(距離上次生成還不到1秒)      @weakify(self);      self.loadingDispose = [[[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {          [subscriber sendCompleted];          return nil;      }] delay:1] //延時(shí)一秒      subscribeCompleted:^{          @strongify(self);          doRequest();          self.loadingDispose = nil;      }];  }  上面代碼看起來挻費(fèi)解,不過下面一段類似的代碼拆開寫的,會(huì)比較容易理解:

[objc] view%20plain copy 派生到我的代碼片[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在每次被調(diào)用subscriibeNext:^(id x)或subscribeCompleted:^方法時(shí)(12行和17行),它創(chuàng)建進(jìn)傳進(jìn)的參數(shù)block_1就會(huì)被觸動(dòng)發(fā),而block_1中的sendNext:方法會(huì)調(diào)用subscriibeNext:^中對(duì)應(yīng)的block_2, 而block_1中的sendCompleted會(huì)調(diào)用subscribeCompleted:中對(duì)應(yīng)的block_3


發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 西安市| 佛教| 黄平县| 定日县| 大化| 定边县| 新沂市| 资溪县| 广汉市| 始兴县| 团风县| 井研县| 津南区| 岑溪市| 张家口市| 西峡县| 溧阳市| 濉溪县| 望谟县| 靖州| 曲阳县| 朝阳市| 绥化市| 长兴县| 南平市| 唐海县| 隆子县| 昌邑市| 太仓市| 宣武区| 扶沟县| 旬邑县| 陕西省| 赣榆县| 横山县| 北京市| 宁武县| 安西县| 读书| 中西区| 铁岭县|