rac 关于RACScheduler的一点学习

RACScheduler  信号调度器,是一个线性执行队列,rac中的信号能够在RACScheduler上执行任务、发送结果,底层用GCD封装的。react

rac中提供生成线程的几个方法:编程

 

1:scheduler,这是一个异步线程,不会对主线程形成堵塞,异步执行数组

[[RACScheduler scheduler] schedule:^{
        NSLog(@"当前线程:%@",[RACScheduler currentScheduler]);
    }];

 

2:immediateScheduler ,当即执行的线程,其实就是在主线程执行的异步

[[RACScheduler immediateScheduler] schedule:^{
        NSLog(@"当前线程:%@",[RACScheduler currentScheduler]);
    }];

  输出日志: org.reactivecocoa.ReactiveObjC.RACScheduler.mainThreadSchedulerspa

 

3:mainThreadScheduler   获取主线程调度器。线程

[[RACScheduler mainThreadScheduler] schedule:^{
        NSLog(@"当前线程:%@",[RACScheduler currentScheduler]);
    }];

   这个其实和immediateScheduler差很少的玩意日志

 

4:currentScheduler   前几个中就能看到,就是获取当前线程调度器。code

[RACScheduler currentScheduler]

 

5:如何指定调度器的优先级。具体使用方法schedulerWithPriorityblog

rac提供了枚举类型:继承

RACSchedulerPriorityLow

RACSchedulerPriorityDefault

RACSchedulerPriorityBackground

RACSchedulerPriorityHigh

具体使用方法以下:

//  思考。 如何指定某个线程的优先级
    [[RACScheduler schedulerWithPriority:RACSchedulerPriorityLow] schedule:^{
        NSLog(@"aaaaa:%@",[RACScheduler currentScheduler]);
    }];

    [[RACScheduler schedulerWithPriority:RACSchedulerPriorityDefault] schedule:^{
        NSLog(@"bbbbb:%@",[RACScheduler currentScheduler]);
    }];

    [[RACScheduler schedulerWithPriority:RACSchedulerPriorityBackground] schedule:^{
        NSLog(@"cccccc:%@",[RACScheduler currentScheduler]);
    }];
    
    [[RACScheduler schedulerWithPriority:RACSchedulerPriorityHigh] schedule:^{
        NSLog(@"dddddd:%@",[RACScheduler currentScheduler]);
    }];

 

------------------    如下列举一下经常使用的用于调度、执行任务的方法

1:  schedule   马上执行       

  上面有使用案例

 

2:afterDelay    会将开启的线程休眠到指定时间后执行block 

// 异步线程
    [[RACScheduler mainThreadScheduler] afterDelay:2 schedule:^{
        NSLog(@"--------%@",[RACScheduler currentScheduler]);
    }];

实际使用能够用来作延迟的操做。。。。。

 

3:如下是参考别的文章拿来的解释

-(RACDisposable *)after:(NSDate *)date repeatingEvery:(NSTimeInterval)intervalwithLeeway:(NSTimeInterval)leeway schedule:( void(^)( void))block;
对这个方法的解释:
当前线程休眠date时间以后执行,而后每隔interval时间重复执行,leeway这个参数是为dispatch source指定一个指望的定时器事件精度,让系统可以灵活地管理并唤醒内核。例如系统可使用leeway值来提早或延迟触发定时器,使其更好地与其它系统事件结合。建立本身的定时器时,应该尽可能指定一个leeway值。不过就算指定leeway值为0,也不能完彻底全指望定时器可以按照精确的纳秒来触发事件


 
4:deliverOn   线程的切换  在设置的调度中发送信号值,但操做封包依然在原来的调度里进行
 
NSArray *temArr = @[@"1",@"2"];
    [[temArr.rac_sequence.signal deliverOn:[RACScheduler mainThreadScheduler]] subscribeNext:^(id  _Nullable x) {
        
    }];

大概意思就是把这个遍历的操做放到主线程中执行了,不然遍历的操做是在异步线程中执行的

 

5:subscribeOn    在设置的调度中发送信号和执行都在同一个Scheduler操做

案例

[[[RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
        NSLog(@"sendSignal%@",[NSThread currentThread]);
        [subscriber sendNext:@"我是发送的数据"];
        [subscriber sendCompleted];
        return nil;
    }] subscribeOn:[RACScheduler mainThreadScheduler]] subscribeNext:^(id  _Nullable x) {
        NSLog(@"xxxx:%@",x);
        NSLog(@"receiveSignal%@",[NSThread currentThread]);
    }];

 

说明一下subscribeOn和deliverOn的区别。      其实说白了,deliverOn 会让发送信号和接收信号不在一个线程中。就想上面的遍历数组的例子,目的就是不想让接受在异步中,否则得处理代码执行顺序的问题。     而subscribeOn恰好相反,会让发送信号和接收信号在一个线程中。

//   注意数组的遍历发送信号必定是在异步线程中执行的,,因此用subscribeOn,而后设置在主线程中接受是无效的。

代码以下:

NSArray *temArr = @[@"1",@"2"];
    [[temArr.rac_sequence.signal subscribeOn:[RACScheduler mainThreadScheduler]] subscribeNext:^(id  _Nullable x) {
        NSLog(@"%@",[RACScheduler currentScheduler]);
    }];

这个设置[RACScheduler mainThreadScheduler]  是无效的。。。。

 

6:timeout   超时。。。

详细事例:

static int time = 0;
    [[RACSignal interval:1 onScheduler:[RACScheduler scheduler]] subscribeNext:^(NSDate * _Nullable x) {
        time ++;
        NSLog(@"%d",time);
    }];
    
    
    [[[RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber>  _Nonnull subscriber) {
        return nil;
    }] timeout:10 onScheduler:[RACScheduler currentScheduler]] subscribeNext:^(id  _Nullable x) {
        NSLog(@"xxxxx:%@",x);
    } error:^(NSError * _Nullable error) {
        NSLog(@"error:%@",error);
    }];

 

7:interval   这玩意就是定时器。

事例见上个案例。

 

---------------   

ReactiveCocoa操做须知:

全部的信号(RACSignal)均可以进行操做处理,由于全部操做方法都定义在RACStream.h中,所以只要继承RACStream就有了操做处理方法

 

ReactiveCocoa操做思想:

运用的是Hook(钩子)思想,Hook是一种用于改变API(应用程序编程接口:方法)执行结果的技术.

•Hook用处:截获API调用的技术。

Hook原理:在每次调用一个API返回结果以前,先执行你本身的方法,改变结果的输出

 
 
----------
就到这吧    over
相关文章
相关标签/搜索