iOS 架构首页投稿(暂停使用,暂停投稿)iOS Developer

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

2016-07-15  本文已影响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基本几大类的用法,慢慢体会,你会发现挺有意思的,学知识要循序渐进,今天就先写这么多吧。很快将会有下一阶段的讲解,从简到繁,喜欢的朋友欢迎关注,谢谢支持。

上一篇 下一篇

猜你喜欢

热点阅读