ReactiveCocoa 模式 —— RACScheduler

start

好,上一篇之后,我们再接再厉,继续下一篇,好好学习如何正确的使用和思考RAC中的一些基本概念。

RACScheduler是RAC中非常重要的概念,原文的博主也说了讲了这个,才能让他的博客对的上模式这个词。

本文译自ReactiveCocoa Design Patterns

注意:下文中,为了方便大家理解,部分单词没有翻译,当然如果需要知道中文的,相对上期,增加的部分如下:

  • scheduler:调度器,词典里面的翻译是计算机里面把需要执行的作业(job)、操作(operation)组织放入到合适的队列的东西

RACScheduler

在ReactiveCocoa的signal里面传递的所有事件,都是通过框架里面一个叫做scheduler的组件去完成的,在RAC里面他的表现形式就是RACScheduler类簇。因为这样的设计为表达同步、异步和延迟事件,以及取消已经在调度中的事件提供了方便的抽象概念。RACScheduler通过调度block来完成对事件传送的操作,可以通过销毁通过schedule方法返回的RACDisposable对象来去掉已经在调度中(scheduling)的block。

RACScheduler是一个类簇,下面还有更为具体的scheduler:

RACImmediateScheduler

RAC内部使用的一个私有scheduler,只支持同步的调度。使用时只是简单的立即执行block,延迟调度工作可以使用-[NSThread sleepUntilDate:]来阻塞当前线程,显然没有任何方法可以阻止scheduler的执行,所以销毁RACDisposable对象什么都不会发生(实际上他的schedule方法返回的是一个nil)。

RACQueueScheduler

这个用的是GCD里面的队列来实现block的schedule,他只是基于GCD的发布(dispatching)block和队列进行了简单的封装,如果你知道GCD是怎么做的,那么你也就知道他是怎么做的了。

RACSubscriptionScheduler

另一个框架内部使用的scheduler,他转发当前的调度到当前的线程(scheduler可以和线程关联),如果当前线程不存在的话,那么会转发到默认的后台线程队列执行。

接口

Scheduler方法是这样子的:

1
2
3
4
5
6
7
- (RACDisposable *)schedule:(void (^)(void))block;
- (RACDisposable *)after:(NSDate *)date schedule:(void (^)(void))block;
- (RACDisposable *)afterDelay:(NSTimeInterval)delay schedule:(void (^)(void))block;
- (RACDisposable *)after:(NSDate *)date repeatingEvery:(NSTimeInterval)interval withLeeway:(NSTimeInterval)leeway schedule:(void (^)(void))block;

通过block创建调度的方法像这样:

1
2
3
4
5
6
RACDisposable *disposable = [[RACScheduler mainThreadScheduler] afterDelay:5.0 schedule:^{
// 需要做的事情
}];
// 如果你改变主意了
[disposable dispose]; // block 将会被取消,也就不会执行了

end

这一篇的内容超精简,不过讲的内容也不多,但是在RAC里面确是非常重要的一个概念。

现在发出来的这三篇主要是讲RAC框架里面提供的基础工具的,接下来还有一篇是flattenMap相关概念的,这三篇之后,就会开始讲到真正的RAC设计模式的相关内容了,其中最为主要的就是MVVM模式了,敬请期待。