知识共享许可协议本作品采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可。本文仅作为个人学习记录使用,欢迎在许可协议范围内转载或使用,请尊重版权并且保留原文链接,谢谢您的理解合作。如果您觉得本站对您能有帮助,您可以使用RSS方式订阅本站,这样您将能在第一时间获取本站信息。

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模式了,敬请期待。

最后欢迎大家订阅我的微信公众号 Little Code

公众号

  • 公众号主要发一些开发相关的技术文章
  • 谈谈自己对技术的理解,经验
  • 也许会谈谈人生的感悟
  • 本人不是很高产,但是力求保证质量和原创