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: 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 = @[@"",@""];
[[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 = @[@"",@""];
[[temArr.rac_sequence.signal subscribeOn:[RACScheduler mainThreadScheduler]] subscribeNext:^(id _Nullable x) {
NSLog(@"%@",[RACScheduler currentScheduler]);
}];

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

6:timeout   超时。。。

详细事例:

static int time = ;
[[RACSignal interval: onScheduler:[RACScheduler scheduler]] subscribeNext:^(NSDate * _Nullable x) {
time ++;
NSLog(@"%d",time);
}]; [[[RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
return nil;
}] timeout: 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

rac 关于RACScheduler的一点学习的更多相关文章

  1. 关于Set和Map数据结构的一点学习

    关于js的Set和Map结构的学习和记录 对阮一峰老师的ES6入门和网上有关资料的的一点学习和记录 1.Set数据结构 Set构造函数的参数是一个可遍历( iterator)对象 Set中的成员值是唯 ...

  2. Vagrant 安装Oracle19c RAC测试环境的简单学习

    1. 学习自网站: https://xiaoyu.blog.csdn.net/article/details/103135158 简单学习了下 能够将oracle RAC开起来了 但是 对后期的维护和 ...

  3. FloatingActionButton的一点学习感悟

    最近在学习android材料设计的新控件,前面一篇文章讲到 CoordinatorLayout 结合几个新控件可以实现的几个效果.其中第一个是,Coordinatorlayout + Floating ...

  4. 嵌入式Linux的一点学习心得

    Linux本身是一个发展中的操作系统.它有很多前期不完善的机制,被后代用新的机制代替.但是老的机制不可能一下子就消亡,因此由于“历史原因”,会产生很多新旧机制共存的情况.而且Linux的教科书数不胜数 ...

  5. 关于 truncate table 的一点学习札记

    ---下面整理笔记来之 itpub 的各位前辈的语录.这里做了一个汇总.仅供学习. truncate table后,oracle会回收表和其表中所在的索引到initial 大小,也就是初始分配的seg ...

  6. numpy的一点学习

    1.Numpy模块 NumPy是Python中的一个运算速度非常快的一个数学库,它非常重视数组.它允许你在Python中进行向量和矩阵计算,并且由于许多底层函数实际上是用C编写的,因此你可以体验在原生 ...

  7. javascript的一点学习

    最近用vue.js用的很爽,在全栈开发的路上一路狂奔,发现后台跟前台一起确实更有意义. 记录一个比较有意思的bug: 目标是对一个全局的paramList进行json格式化显示.代码借鉴了 http: ...

  8. AngularJS的一点学习笔记

    ng-options="item.action for item in todos" ng-options表达式的基本形式, 形如 "<标签> for < ...

  9. fork 函数的一点学习

    昨天某位少年问了我一个问题,#include<stdio.h> int main() { fork(); fork(); fork(); printf("hello " ...

随机推荐

  1. 【FFMPEG】【ARM-Linux开发】arm上安装FFMPEG

    交叉编译工具下载地址 : https://launchpad.net/linaro-toolchain-binaries/+download 其中我下载的是 : gcc-linaro-arm-linu ...

  2. JS中删除数组中的元素方法

    删除指定下标数组元素 Array.prototype.del=function(index){ if(isNaN(index)||index>=this.length){ return fals ...

  3. SQL FIND_IN_SET() 判断某一个数是否存在于数据表某个以逗号分隔开字段数据中

    数据表中的字段存储的是以逗号分隔开的字符串, 例如 (1,2,6,8) 以前不知道这个用法, 碰到比如 8 是否包含在改字符串里面只能一个个取出来, 然后解析成数组,再判断是否在该数组中,效率极低: ...

  4. javascript let

    es6支持通过let关键字声明属于单独块{}的变量,更好的管理变量作用屿 funtion foo() { var a=1; if (a>1) { let b=2; //只属于if模块 while ...

  5. WebForm——浅拷贝与深拷贝

    注:本文整理来自连接 https://www.cnblogs.com/echolun/p/7889848.html ,感谢博主的分享 总结: 1.浅拷贝:只拷贝变量的名,而不拷贝变量的值——常为引用类 ...

  6. 导出远程oracle数据库到本地

    1.以管理员身份运行 Net Manager 以管理员身份运行cmd

  7. oracle中表记录被另一个用户锁住

    应用场景 在查询oracle表时,提示表记录被另一个用户锁住了 有可能是在使用了pl/sql工具后修改某个表记录时,加锁,或者发生故障异常退出,下次登录进去修改不了 查询锁 --查看数据库的锁的来源. ...

  8. 测试工作小工具~总结&下载连接

    1.Gif录制小工具(动图提单 ≖ᴗ≖) 地址:https://licecap.en.softonic.com/download

  9. layui upload 在JS动态加载内容后, 点击按钮无反应

    /** * 根据用户选择的不同规格选项 * 返回 不同的输入框选项 */ function ajaxGetSpecInput2(spec_arr) { var goods_id = $('#goods ...

  10. golang代码中生成pprof和trace报告

    // 生成 CPU 报告 import ( "context" "runtime/pprof" "log" ) func cpuProfil ...