美文网首页
RAC中的RACScheduler

RAC中的RACScheduler

作者: 一只二进制编码的狗 | 来源:发表于2016-01-21 10:59 被阅读696次

RACScheduler对GCD进行了封装:
1.获取RACScheduler对象的方式有多种
首先看第一种

+ (instancetype)immediateScheduler {
    static dispatch_once_t onceToken;
    static RACScheduler *immediateScheduler;
    dispatch_once(&onceToken, ^{
        immediateScheduler = [[RACImmediateScheduler alloc] init];
    });
    
    return immediateScheduler;
}

RACImmediateScheduler是RACScheduler的子类,初始化的操作还是会走到父类的初始化方法

//RACImmediateScheduler初始化方法
- (id)init {
    return [super initWithName:@"com.ReactiveCocoa.RACScheduler.immediateScheduler"];
}
//RACScheduler初始化方法
- (id)initWithName:(NSString *)name {
    self = [super init];
    if (self == nil) return nil;

    if (name == nil) {
        _name = [NSString stringWithFormat:@"com.ReactiveCocoa.%@.anonymousScheduler", self.class];
    } else {
        _name = [name copy];
    }

    return self;
}

再看第二种

+ (instancetype)mainThreadScheduler {
    static dispatch_once_t onceToken;
    static RACScheduler *mainThreadScheduler;
    dispatch_once(&onceToken, ^{
        mainThreadScheduler = [[RACTargetQueueScheduler alloc] initWithName:@"com.ReactiveCocoa.RACScheduler.mainThreadScheduler" targetQueue:dispatch_get_main_queue()];
    });
    
    return mainThreadScheduler;
}

RACTargetQueueScheduler的核心操作如下:

- (id)initWithName:(NSString *)name targetQueue:(dispatch_queue_t)targetQueue {
    NSCParameterAssert(targetQueue != NULL);

    if (name == nil) {
        name = [NSString stringWithFormat:@"com.ReactiveCocoa.RACTargetQueueScheduler(%s)", dispatch_queue_get_label(targetQueue)];
    }
//创建一个queue,并且设置其优先级和targetQueue相同
    dispatch_queue_t queue = dispatch_queue_create(name.UTF8String, DISPATCH_QUEUE_SERIAL);
    if (queue == NULL) return nil;

    dispatch_set_target_queue(queue, targetQueue);

    return [super initWithName:name queue:queue];
}

还有几种初始化的方法,也比较简单,下面看RACScheduler的操作

- (RACDisposable *)afterDelay:(NSTimeInterval)delay schedule:(void (^)(void))block {
    return [self after:[NSDate dateWithTimeIntervalSinceNow:delay] schedule:block];
}

子类有不同的实现,但都比较简单。类似

- (RACDisposable *)after:(NSDate *)date schedule:(void (^)(void))block {
    NSCParameterAssert(date != nil);
    NSCParameterAssert(block != NULL);

    [NSThread sleepUntilDate:date];
    block();

    return nil;
}

还有一个比较难理解的就是scheduleRecursiveBlock,这个放在RACSequence说

相关文章

  • RAC底层原理分析上

    RACScheduler:信号调度器,是一个线性执行队列,rac中的信号可以在RACScheduler上执行任务、...

  • RAC中的RACScheduler

    RACScheduler对GCD进行了封装:1.获取RACScheduler对象的方式有多种首先看第一种 RACI...

  • RAC其他

    RACScheduler:RAC中的队列,用GCD封装的。RACUnit :表⽰stream不包含有意义的值,也就...

  • RacScheduler任务队列

    RACScheduler //RAC封装的多线程/单线程block调用接口。特点:可以递归执行blo...

  • RACUnit和RACScheduler

    RACUnit RACUnit类中只有一个单例 RACScheduler RACScheduler 是一个线性执行...

  • ReactiveCocoa源码阅读之RACScheduler

    RACScheduler作为调度器,底层只是对GCD的简单的封装,下面是RACScheduler的类簇图: 可以看...

  • RACScheduler

    文章系列《ReactiveCocoa 概述》[https://www.jianshu.com/p/2b12b665...

  • ReactiveObjC(一)

    RACDisposable disposable 销毁RACScheduler scheduler 调度RACC...

  • iOS-ReactiveObjC(RAC) 学习笔记

    RAC简介 在RAC中,万物皆信号。RAC 指的就是 RactiveCocoa ,是 Github 的一个开源框架...

  • ReactiveCocoa详解

    一、RAC介绍 RAC 是一个 iOS 中的函数式响应式编程框架,一般与MVVM配套使用。在非RAC开发中,都是习...

网友评论

      本文标题:RAC中的RACScheduler

      本文链接:https://www.haomeiwen.com/subject/hvjlkttx.html