iOS RAC - RACCommand

文章系列
《RACSignal 》
《RACDisposable》
《RACSubject、RACReplaySubject》
《iOS RAC - 基本用法》
《iOS RAC - 定时器》
《iOS RAC - RACMulticastConnection》
《iOS RAC - RACCommand》
《iOS RAC - 核心方法bind》
《iOS RAC - 集合RACTuple、RACSequence》
《iOS RAC - rac_leftSelector》
《iOS RAC - 映射》
《iOS RAC - 过滤》
《iOS RAC - 登录页面,MVVM》



git地址



Command翻译过来就是命令,RACCommand是用来干啥子的呢?我们来简单的看看。

    RACCommand * command = [[RACCommand alloc] initWithSignalBlock:^RACSignal * _Nonnull(id  _Nullable input) {
        
        
        return nil;
    }];
    
    [command execute:@"开始飞起来"];

然后就愉快的运行了,然后就是愉快的奔溃了。然后我们查看一下奔溃日志

奔溃信息

在log中很明确的告诉我们,返回的信号不能为空,既然如此我们就放回一个信号给他呗。

于是代码变成了这样子的:

RACCommand * command = [[RACCommand alloc] initWithSignalBlock:^RACSignal * _Nonnull(id  _Nullable input) {
        
        
        return [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
            
            return nil;
        }];
    }];

再次愉快的运行,这次没有奔溃,啥都没有,那我们发送的数据呢?[command execute:@"开始飞起来"];
没错就是在创建command的block中的input参数
我们可以打印一下

打印input

既然返回的是一个信号,那我们就尝试着发布信息

RACCommand * command = [[RACCommand alloc] initWithSignalBlock:^RACSignal * _Nonnull(id  _Nullable input) {
        
        NSLog(@"%@",input);
        
        return [RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
            
            [subscriber sendNext:@"大佬大佬放过我"];
            
            return nil;
        }];
    }];



这个时候问题来了,发送的信息谁去接收呢???

这个时候我们注意一下execute这个方法

execute



把代码改成这个样子,大胆的猜测一下,在创建的方法中返回的信号就是他

RACSignal * signal = [command execute:@"开始飞起来"];
    
    [signal subscribeNext:^(id  _Nullable x) {
        NSLog(@"接收数据 - %@",x);
    }];

运行查看结果


果不其然啊

还有没有别的方法可以拿到呢?肯定有啦,不然就打这行字啦

[command.executionSignals subscribeNext:^(id  _Nullable x) {
        NSLog(@"接收数据 - %@",x);
    }];

通过这个也可以获取到数据,executionSignals就是用来发送信号的信号源,需要注意的是这个方法一定要在执行execute方法之前,否则就不起作用了,然后就运行程序发现,给我的竟然是一个信号????黑人问号??

返回的数据

事已至此,既然是信号我们就在订阅一次吧,看看会拿到什么值。

订阅信号

好吧,一波三折终于拿到了值,现在我们要去看看execute这个方法里面到底做了什么骚操作,不然心有不甘啊……

关键

就是这个家伙我们才可以先发送后订阅啊

上面的操作是不是很繁琐?没关系,RAC肯定给了你更好的骚操作
除了上面那个双层订阅,我们还可以用这个switchToLatest

是不是简单啦??

其中switchToLatest表示的是最新发送的信号,验证一下看他是不是最新的信号吧。

1、先创建5个RACSubject,其中第一个为信号中的信号(也就是发送的数据是信号)

    RACSubject *signalofsignal = [RACSubject subject];
    RACSubject *signal1 = [RACSubject subject];
    RACSubject *signal2 = [RACSubject subject];
    RACSubject *signal3 = [RACSubject subject];
    RACSubject *signal4 = [RACSubject subject];



2、然后我们就订阅信号中的信号(因为我们约定了,发送的是信号,所以接收到的也是信号,既然是信号,那就可以订阅)

[signalofsignal subscribeNext:^(id  _Nullable x) {
        [x subscribeNext:^(id  _Nullable x) {
            NSLog(@"%@",x);
        }];
    }];



3、发送数据

    [signalofsignal sendNext:signal1];
    [signal1 sendNext:@"1"];

现在我们查看log吧


验证

现在我们在用switchToLatest在去订阅看看

验证

可以看到一样可以拿到数据,现在我们开始测试发送多个信号,看拿到是不是最后一个信号

验证

OK,会到command中,我们现在已经验证了之前的推测,现在如果想监听到执行完成或者还在执行就可以这样子

监听执行

在上面的过程中,我们发现有两点不太对:

  • 1、刚运行的时候就来了一次执行结束,这个不是我们想要的
  • 2、并没有结束,但其实我们已经完成了

我们先解决第2个问题,在command的block我们可以注意到,我们在signal的block中只发送了数据,并没有告诉外界发送完成了,所以就导致了,一直没发送完成,所以我们在发送数据之后加上[subscriber sendCompleted];

结束了

然后我们在来看第1个问题,为什么第一次就执行结束了,这次的判断不是我们想要的, 那我们可不可以跳过呢?
答案肯定是可以的啦
这个时候我需要用到一个方法skip,这个方法后面有一个参数,填的就是忽略的次数,我们这个时候只想忽略第一次, 所以就填1

[[command.executing skip:1] subscribeNext:^(NSNumber * _Nullable x) {
        if ([x boolValue]) {
            NSLog(@"还在执行");
        }else{
            NSLog(@"执行结束了");
        }
    }];

这个时候我们在运行,然后看log

最终

既然提到了skip那就随便可以提提其它的类似的方法
filter过滤某些
ignore忽略某些值
startWith从哪里开始
skip跳过(忽略)次数
take取几次值 正序
takeLast取几次值 倒序

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,847评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,208评论 1 292
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,587评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,942评论 0 205
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,332评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,587评论 1 218
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,853评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,568评论 0 198
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,273评论 1 242
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,542评论 2 246
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,033评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,373评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,031评论 3 236
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,073评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,830评论 0 195
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,628评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,537评论 2 269

推荐阅读更多精彩内容