细说ReactiveCocoa的冷信号与热信号(一)
背景ReactiveCocoa(简称RAC)是最初由GitHub团队开发的一套基于Cocoa的FRP框架。FRP即Functional Reactive Programming(函数式响应式编程),其优点是用随时间改变的函数表示用户输入,这样就不需要可变状态了。我们之前的文章“RACSignal的Subscription深入分析”里曾经详细讲解过RAC核心概念之一RACSignal的实现原理。在美团客户端中,我们大量使用了这个框架。冷信号与热信号的概念很容易混淆并造成一定的问题。鉴于这个问题具有一定普遍性,我将用一系列文章讲解RAC中冷信号与热信号的相关知识点,希望可以加深大家的理解。本文是系列文章的第一篇。 p.s. 以下代码和示例基于ReactiveCocoa v2.5。 什么是冷信号与热信号冷热信号的概念源于.NET框架Reactive Extensions(RX)中的Hot Observable和Cold Observable,两者的区别是:
这里面的Observables可以理解为RACSignal。为了加深理解,我们来看这样的几组代码: RACSignal *signal = [RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) { [subscriber sendNext:@1]; [subscriber sendNext:@2]; [subscriber sendNext:@3]; [subscriber sendCompleted]; return nil; }]; NSLog(@"Signal was created."); [[RACScheduler mainThreadScheduler] afterDelay:0.1 schedule:^{ [signal subscribeNext:^(id x) { NSLog(@"Subscriber 1 recveive: %@",x); }]; }]; [[RACScheduler mainThreadScheduler] afterDelay:1 schedule:^{ [signal subscribeNext:^(id x) { NSLog(@"Subscriber 2 recveive: %@",x); }]; }]; 以上简单地创建了一个信号,并且依次发送@1,@2,@3作为值。下面分别有两个订阅者在不同的时间段进行了订阅,运行的结果如下: 2015-08-11 18:33:21.681 RACDemos[6505:1125196] Signal was created. 2015-08-11 18:33:21.793 RACDemos[6505:1125196] Subscriber 1 recveive: 1 2015-08-11 18:33:21.793 RACDemos[6505:1125196] Subscriber 1 recveive: 2 2015-08-11 18:33:21.793 RACDemos[6505:1125196] Subscriber 1 recveive: 3 2015-08-11 18:33:22.683 RACDemos[6505:1125196] Subscriber 2 recveive: 1 2015-08-11 18:33:22.683 RACDemos[6505:1125196] Subscriber 2 recveive: 2 2015-08-11 18:33:22.683 RACDemos[6505:1125196] Subscriber 2 recveive: 3 我们可以看到,信号在18:33:21.681时被创建,18:33:21.793依次接到1、2、3三个值,而在18:33:22.683再依次接到1、2、3三个值。说明了变量名为 我们再对这段代码进行一个小的改动: RACMulticastConnection *connection = [[RACSignal createSignal:^RACDisposable *(id<RACSubscriber> subscriber) { [[RACScheduler mainThreadScheduler] afterDelay:1 schedule:^{ [subscriber sendNext:@1]; }]; [[RACScheduler mainThreadScheduler] afterDelay:2 schedule:^{ [subscriber sendNext:@2]; }]; [[RACScheduler mainThreadScheduler] afterDelay:3 schedule:^{ [subscriber sendNext:@3]; }]; [[RACScheduler mainThreadScheduler] afterDelay:4 schedule:^{ [subscriber sendCompleted]; }]; return nil; }] publish]; [connection connect]; RACSignal *signal = connection.signal; NSLog(@1.1 schedule:^{ [signal subscribeNext:^(id x) { NSLog(@2.1 schedule:^{ [signal subscribeNext:^(id x) { NSLog(@ 稍微有些复杂,我们来一一分析: (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |