从数据生产与消费的角度理解RACSignal

从数据生产与消费的角度理解RACSignal

在ReactiveCocoa框架的世界里,接触到最多的最常见的类就是RACSignal,凡是接触过ReactiveCocoa的程序员,都或多或少,以直接或间接的方式与RACSignal打过交道。

但是每当提及RACSignal是什么,以及为什么要使用它时,总是感觉一知半解,说不知道吧也知道点儿,说知道吧又不是很清楚,试图回答时却感觉没有回答到要点上。下文中我试图谈一下我自己的理解。

首先抛出一个观点:我们编写的程序,无论是前端还是后端,都是围绕着处理数据展开的,其次在处理数据之前,我们必须能够获取到数据。

我们按职责划分,将数据处理模块划分为两个模块,需要使用数据的模块称为数据消费者,提供数据的称为数据生产者。二者的关系为:数据消费者通过调用数据生产者来获取自己需要的数据,在这个过程中,二者各需要关注以下几点:

数据生产者

  • 以何种方式封装数据生产过程?
  • 数据生产完成以后,以何种机制提供给数据消费者使用?

数据消费者

  • 如何触发数据获取过程?
  • 如何获取到来自生产者提供的数据?

数据生产者

在ReactiveCocoa框架的世界中,RACSignal扮演的就是数据生产者的角色。因此RACSignal必须满足上述数据生产者的两个基本需求,这是其职责所在。下面就具体以RACSignal为例,阐明其是如何满足上述两个基本需求的。

RACSignal是如何封装数据生产过程的?

RACSignal的+createSignal:方法接收一个block作为参数,该block定义了数据的生产过程。比如下面的例子,+createSignal:方法的参数传了了一个block,此block中封装了账户登录网络请求的过程。

- (RACSignal *)signInSignal {
    return [RACSignal createSignal:^RACDisposable *(id subscriber) {
        [self.signInService
         signInWithUsername:self.usernameTextField.text
         password:self.passwordTextField.text
         complete:^(BOOL success) {
             [subscriber sendNext:@(success)];
             [subscriber sendCompleted];
         }];
        return nil;
    }];
}

RACSignal以何种方式将其生产的数据发送给数据消费者使用?

RACSignal的实例是一个对象,该对象支持订阅,数据消费者以订阅该对象的形式获取到生产的数据并使用。比如下面的例子,数据消费者创建了一个RACSignal的对象signInSignal,随后通过-subscribeNext:方法订阅该对象,获取数据。

- (void)signInButton {
    RACSignal *signInSignal = [self signInSignal];
    
    [signInSignal subscribeNext:^(id x) {
        NSLog(@"Sign in result: %@", x);
    }];
}

RACSignal是以发布-订阅的模式来进行通信的,而不是以直接通信的方式发送给数据使用者的。

数据消费者

数据消费者一般是我们程序中的对象,NSObject或其子类的一个实例,比如UIViewController的实例。

数据消费者以何种方式触发数据获取流程?

数据获取流程会在订阅发生时自动触发。比如下面的例子,当调用signInSignal-subscribeNext:方法时,在+createSignal:阶段传入的block(该block里面的代码就是获取数据流程)就会执行,从而触发登录请求的执行。

- (void)signInButton {
    RACSignal *signInSignal = [self signInSignal];
    
    [signInSignal subscribeNext:^(id x) {
        NSLog(@"Sign in result: %@", x);
    }];
}

如何获取到数据生产者提供给自己的数据?

-subscribeNext:方法的参数是一个block,该block有一个id类型的参数x,正是通过该参数,数据消费者拿到来自数据生产者的数据并使用。

结语

RACSignal是一个类,该类封装了数据获取过程,并提供一种数据使用机制。

你可能感兴趣的:(从数据生产与消费的角度理解RACSignal)