zoukankan      html  css  js  c++  java
  • rac 关于RACScheduler的一点学习

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

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

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

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

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

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

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

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

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

       这个其实和immediateScheduler差不多的玩意

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

    [RACScheduler currentScheduler]

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

    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
  • 相关阅读:
    【原创】elasticsearch入门
    【原创】nginx入门
    【原创】SpringMVC同一RequestMapping返回不同的类型
    [原创]在Centos7.2上源码安装PHP、Nginx、Zentao禅道
    CentOS环境下tomcat启动超级慢的解决方案
    [原创]Nginx反向代理及负载均衡
    常见证书格式和转换
    MySQL基本命令
    研究重力加速度随地球纬度递增的原因
    倒霉的一天
  • 原文地址:https://www.cnblogs.com/110-913-1025/p/11872203.html
Copyright © 2011-2022 走看看