美文网首页
RAC框架学习和运用

RAC框架学习和运用

作者: 进阶的蚊子 | 来源:发表于2018-07-10 16:12 被阅读15次

    ReactiveCocoa(简称为RAC),是由Github开源的一个应用于iOS和OS开发的一个框架,
    在我们iOS开发过程中,当某些事件响应的时候,需要处理某些业务逻辑,这些事件都用不同的方式来处理。
    比如按钮的点击使用action,ScrollView滚动使用delegate,属性值改变使用KVO等系统提供的方式。其实这些事件,都可以通过RAC处理。
    ReactiveCocoa为事件提供了很多处理方法,而且利用RAC处理事件很方便,可以把要处理的事情,和监听的事情的代码放在一起,这样非常方便我们管理,就不需要跳到对应的方法里。非常符合我们开发中高聚合,低耦合的思想。
    其实主要就是函数响应式编程.
    先说下如何安装引入框架
    使用cocasPod 来安装 没有cocasPod的请走传送门
    [ 传送门: http://www.cnblogs.com/taoxu/p/4964395.html]

    target 'RACTest' do
    use_frameworks!
    pod  'ReactiveCocoa', '~>2.5'
    end
    

    先导入头文件 #import "ReactiveCocoa.h"

    先放一段代码和结果 再详细说明

    //信号测试
    -(void)testOne
    {
    //信号类 需要自己发送或者 订阅
        RACSignal * singel = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
            
            // subscriber 是订阅者,这是一个协议,不是一个类。发送信号
            [subscriber sendNext:@"这是个测试666"];
            [subscriber sendNext:@"这是个测试777"];
            // 发送完成
            [subscriber  sendCompleted];
            
            // RACDisposable:用于取消订阅或者清理资源,当信号发送完成或者发送错误的时候,就会自动触发它。
            // 执行完Block后,当前信号就不在被订阅了。
            return [RACDisposable disposableWithBlock:^{
                
                NSLog(@"信号被销毁");
                
            }];
        }];
        
        //singel信号类调用subscribeNext方法订阅信号。订阅之后才会激活这个信号,注意顺序!
        [singel subscribeNext:^(id x) {
            // block调用时刻:每当有信号发出数据,就会调用block.
            NSLog(@"接收到数据:%@",x);
        }];
    }
    
    
    01.png

    RACSiganl (信号类)
    1:RACSiganl(信号类)只是表示当数据改变时,信号内部会发出数据,它本身不具备发送信号的能力,而是交给内部一个订阅者subscriber去发出。

    2:默认一个信号都是冷信号,就算是值改变了,但你没有订阅这个信号的话它也不会触发的,只有订阅了这个信号,这个信号才会变为热信号,值改变了才会触发。

    RACSubject
    RACSubject(信号提供者)它自己可以充当信号,又能发送信号

    -(void)testTwo
    {
        //RACSubject(信号提供者)它自己可以充当信号,又能发送信号
        RACSubject  * subject = [RACSubject subject];
        
        // 自己订阅了信号
        [subject subscribeNext:^(id x) {
            
            NSLog(@"现在我是第一个订阅者:  %@",x);
            
        }];
        
        [subject subscribeNext:^(id x) {
            
            NSLog(@"现在我是第二个订阅者:  %@",x );
            
        }];
        
        // 自己发送了信号
        [subject sendNext:@"我发送了第一个信号001"];
        [subject sendNext:@"我发送了第一个信号002"];
    }
    
    02.png

    大致原理了解了,基础学习先到这里,下面我们研究如何结合项目实际运用.

    1. 文本框监测
    //文本框监测
    -(void)textDemo
    {
        @weakify(self);
        [self.txtFirst.rac_textSignal subscribeNext:^(NSString *value) {
            @strongify(self);
            
            self.value = value;
            NSLog(@"新的值:%@",value);
            
            
        }];
        
        //当self.value的值变化时调用Block,这是用KVO的机制,RAC封装了KVO
        
        [RACObserve(self, value) subscribeNext:^(NSString *value) {
            
            NSLog(@"监测到:%@",value);
            
        }];
        
        
        
    }
    
    03.png

    2.kvo监测 在上述方法中已实现 结果如图

    3.代理 传统的代理就不写了 直接上rac样式的
    在页面加了个按钮点击跳转

    - (IBAction)next:(id)sender {
        [self delegateDemo];
    }
    
    -(void)delegateDemo
    {
        
       UIStoryboard *storyboard = [UIStoryboard storyboardWithName:@"Main" bundle: nil];
        
        
        NextViewController *racsub = [storyboard instantiateViewControllerWithIdentifier:@"NextViewController"];
        racsub.subject = [RACSubject subject];
        [racsub.subject subscribeNext:^(id x) {
            NSLog(@"接受到通知:%@",x);
        }];
         
         [self presentViewController:racsub animated:YES completion:nil];
        
        
    }
    
    

    在 NextViewController 是声明一个属性 其实有点像传统的代码块block
    @property (nonatomic, strong) RACSubject *subject;

    
    if (self.subject) {
            [self.subject sendNext:@"发送了返回信号"];
            
        }
        
        [self dismissViewControllerAnimated:YES completion:nil];
    

    4 通知

    -(void)noticeDemo
    {  NSNotificationCenter *center = [NSNotificationCenter defaultCenter];
        
        //发送广播通知
        [center postNotificationName:@"work" object:nil userInfo:@{@"key":@"你逗我呢"}];
        
        
        //接收通知
        
        
        //RAC的通知不需要我们手动移除
        //注册广播通知
        RACSignal *siganl = [center rac_addObserverForName:@"work" object:nil];
        //设置接收通知的回调处理
        [siganl subscribeNext:^(NSNotification *x) {
            
            NSLog(@"测试: %@",x.userInfo[@"key"]);
        }];
        
                                            
    }
    
    

    一般项目应用差不多就涉及到这些吧,以后遇到新的应用也会在空闲时更新的!

    相关文章

      网友评论

          本文标题:RAC框架学习和运用

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