iOS RAC学习笔记 从零起步 (第二天)

作者: 睡不着的叶 | 来源:发表于2016-07-15 18:26 被阅读1718次

    前言

    书接上回,上回讲到了RAC的基本概念还有基础的类,相信大家有一定的印象了。可能有很多人说还不懂怎么应用,或者有点理解不透彻。表着急,现在我就一点一点从简单应用开始,配合代码,给大家一点明确的讲解,告诉大家RAC的部分简单应用,作为今天的第二天课程。

    RACSubject简单应用

    1. RACSubject的使用步骤

    RACSubject使用步骤

    2. RACSubject替换代理
    需求逻辑:页面一有一个按钮,点击按钮,跳转到页面二。页面二也有个按钮,点击页面二的按钮,页面一接收到按钮被点击的事件。

    页面二.h 页面一.m 页面二.m

    3.RACCommand
    RAC中用于处理事件的类,可以把事件如何处理,事件中的数据如何传递,包装到这个类中,他可以很方便的监控事件的执行过程。

    // 一、RACCommand使用步骤:
    // 1.创建命令 initWithSignalBlock:(RACSignal * (^)(id input))signalBlock
    // 2.在signalBlock中,创建RACSignal,并且作为signalBlock的返回值
    // 3.执行命令 - (RACSignal *)execute:(id)input

    // 二、RACCommand使用注意:
    // 1.signalBlock必须要返回一个信号,不能传nil.
    // 2.如果不想要传递信号,直接创建空的信号[RACSignal empty];
    // 3.RACCommand中信号如果数据传递完,必须调用[subscriber sendCompleted],这时命令才会执行完毕,否则永远处于执行中。
    // 4.RACCommand需要被强引用,否则接收不到RACCommand中的信号,因此RACCommand中的信号是延迟发送的。
    
    // 三、RACCommand设计思想:内部signalBlock为什么要返回一个信号,这个信号有什么用。
    // 1.在RAC开发中,通常会把网络请求封装到RACCommand,直接执行某个RACCommand就能发送请求。
    // 2.当RACCommand内部请求到数据的时候,需要把请求的数据传递给外界,这时候就需要通过signalBlock返回的信号传递了。
    
    // 四、如何拿到RACCommand中返回信号发出的数据。
    // 1.RACCommand有个执行信号源executionSignals,这个是signal of signals(信号的信号),意思是信号发出的数据是信号,不是普通的类型。
    // 2.订阅executionSignals就能拿到RACCommand中返回的信号,然后订阅signalBlock返回的信号,就能获取发出的值。
    
    // 五、监听当前命令是否正在执行executing
    
    // 六、使用场景,监听按钮点击,网络请求
    
    
    // 1.创建命令
    RACCommand *command = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
    
    
        NSLog(@"执行命令");
    
        // 创建空信号,必须返回信号
        //        return [RACSignal empty];
    
        // 2.创建信号,用来传递数据
        return [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) {
    
            [subscriber sendNext:@"请求数据"];
    
            // 注意:数据传递完,最好调用sendCompleted,这时命令才执行完毕。
            [subscriber sendCompleted];
    
            return nil;
        }];
    
    }];
    
    // 强引用命令,不要被销毁,否则接收不到数据
    _conmmand = command;
    
    
    
    // 3.订阅RACCommand中的信号
    [command.executionSignals subscribeNext:^(id x) {
    
        [x subscribeNext:^(id x) {
    
            NSLog(@"%@",x);
        }];
    
    }];
    
    // RAC高级用法
    // switchToLatest:用于signal of signals,获取signal of signals发出的最新信号,也就是可以直接拿到RACCommand中的信号
    [command.executionSignals.switchToLatest subscribeNext:^(id x) {
    
        NSLog(@"%@",x);
    }];
    
    // 4.监听命令是否执行完毕,默认会来一次,可以直接跳过,skip表示跳过第一次信号。
    [[command.executing skip:1] subscribeNext:^(id x) {
    
        if ([x boolValue] == YES) {
            // 正在执行
            NSLog(@"正在执行");
    
        }else{
            // 执行完成
            NSLog(@"执行完成");
        }
    
    }]; // 5.执行命令
    [self.conmmand execute:@1];
    

    简单应用代码如下

    场景讲解:列表页面,含有上拉刷新和下拉加载
    (项目中我是用的MVVM模式,不懂的朋友,可以看我原来写的文章,RACCommand写在viewModel类里面)

    viewModel.h

    (.m中含有RACSubscriber,提前讲解一下。表示订阅者的意思,用于发送信号,这是一个协议,不是一个类,只要遵守这个协议,并且实现方法才能成为订阅者。通过create创建的信号,都有一个订阅者,帮助他发送数据。)

    viewModel.m 中刷新数据 viewModel.m 中数据处理

    小结

    今天讲解了RAC基本几大类的用法,慢慢体会,你会发现挺有意思的,学知识要循序渐进,今天就先写这么多吧。很快将会有下一阶段的讲解,从简到繁,喜欢的朋友欢迎关注,谢谢支持。

    相关文章

      网友评论

        本文标题:iOS RAC学习笔记 从零起步 (第二天)

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