iOS快速上手ReactiveCocoa(RAC)

作者: HuyaRC | 来源:发表于2016-11-07 10:37 被阅读140次

分享是每个优秀的程序员所必备的品质


ReactiveCocoa是响应式编程(FRP)在iOS中的一个实现框架,它的开源地址为:https://github.com/ReactiveCocoa/ReactiveCocoa#

例1. 监听对象的成员变量变化,当成员变量值被改变时,触发做一些事情。

这种情况其实就是 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) {  
   request(x);//发送一个请求  
}];

例2. 同时监听多个变量变化,当这些变量满足一定条件时,使button为可点击状态
场景:button监听 两个输入框有值和一个成员变量值,当输入框有输入且成员变量为真时,button为可点击状态
实现:

RAC(self.payButton,enabled) = [RACSignal combineLatest:@[self.priceInput.rac_textSignal,self.nameInput.rac_textSignal,RACObserve(self, isConnected)]
```
----------------
场景:满足上面条件时,直接发送请求
实现:
```
[[RACSignal  combineLatest:<span id="kM0.9520451971329749">@</span>[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。






相关文章

  • iOS快速上手ReactiveCocoa(RAC)

    分享是每个优秀的程序员所必备的品质 ReactiveCocoa是响应式编程(FRP)在iOS中的一个实现框架,它的...

  • 2019-12-10

    iOS开发之RAC(一)初级篇 一、RAC是什么? 1、RAC全称:ReactiveCocoa, Github 一...

  • ReactiveCocoa笔记

    最近在做MVVM项目改造,绕不开reactivecocoa(rac),学习过程中做的一些简单的笔记,用于快速上手,...

  • RAC 的使用

    RAC(ReactiveCocoa) 使用详解 RAC 是什么? ReactiveCocoa(RAC) githu...

  • ReactiveCocoa相关

    1、ReactiveCocoa简介。ReactiveCocoa简称RAC,是由Github开源的一个应用于iOS和...

  • 【other】Rac EventBus RxJava

    聊一聊 Rac Rac 是什么 Rac 全称 Reactivecocoa,是一个应用于iOS和OS X开发的框架,...

  • ReactiveCocoa基础

    ReactiveCocoa简介 ReactiveCocoa(简称为RAC),是由Github开源的一个应用于iOS...

  • 15.ReactiveCocoa

    ReactiveCocoa简介 ReactiveCocoa(简称为RAC),是由Github开源的一个应用于iOS...

  • 初识ReactiveCocoa(一) —— OC项目集成

    先简单介绍下ReactiveCocoa ReactiveCocoa(简称RAC)是Github上一套作用于iOS应...

  • ReactiveCocoa

    ReactiveCocoa简介 ReactiveCocoa(简称为RAC),是由Github开源的一个应用于iOS...

网友评论

本文标题:iOS快速上手ReactiveCocoa(RAC)

本文链接:https://www.haomeiwen.com/subject/kgtouttx.html