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. error: audit:backlog limit exceeded

    报错场景:telnet.ping.ftp都通的情况下,无法ssh服务器 原因:audit缓冲区设置过小,服务器默认缓冲区大小为320kb 解决办法:可通过auditctl -b 8192设定缓冲区大小 ...

  2. DISCO Presents Discovery Channel Code Contest 2020 Qual Task E. Majority of Balls

    Not able to solve this problem during the contest (virtual participation). The first observation is ...

  3. 【AtCoder】AGC011

    AGC011 A - Airport Bus 大意:有N个人,每个人只能在\([T_i,T_i +K]\)这段区间乘车,每辆车安排C人,问最少安排几辆车 直接扫,遇到一个没有车的在\(T_i +K\) ...

  4. Photon Server 实现注册与登录(三) --- 前端UI设计和发起请求

    一.打开之前的测试项目.先将服务端代码编译一下,在 bin/Debug/目录下会发现有一个Common.dill.我们相应导入到前端使用.直接拖拽到相应地方 UI相应布局属于前端操作,这里就不做介绍了 ...

  5. Delphi cxpagecontrol融合窗体

    功能说明: 一.在需要融合的每个窗体加一句 initialization RegisterClasses([TFrmDataDict]); //类名 二.cxpagecontrol融合窗体,在调用时 ...

  6. 轻松搭建CAS 5.x系列(1)-使用cas overlay搭建SSO SERVER服务端

    概要说明 cas的服务端搭建有两种常用的方式:   1. 基于源码的基础上构建出来的   2. 使用WAR overlay的方式来安装 官方推荐使用第二种,配置管理方便,以后升级也容易.本文就是使用第 ...

  7. Unable to bind to http://localhost:8080 on the IPv6 loopback interface: 'Cannot assign requested address'.

    .net core+nginx警告: warn: Microsoft.AspNetCore.Server.Kestrel[0] Unable to bind to http://localhost:5 ...

  8. H5的本地存储(localStorage)和cookie比较

    HTML5 的 web Storage 存储方式有两种:localStorage 和 sessionStorage. sessionStorage就像是会话级别的cookie,数据会随着浏览器关闭而清 ...

  9. git 操作实践

    git操作: - git是一个用于帮助用户实现版本控制的软件 #首先创建项目 1. cd到项目文件目录 2. 鼠标右键点击 Git Bash Here 3. git init #在项目文件目录生成 . ...

  10. linux 打包与解压命令--常用

    一般情况用这俩个就足以了 压缩 tar -czf jpg.tar.gz *.jpg   //将目录里所有jpg文件打包成jpg.tar后,并且将其用gzip压缩,生成一个gzip压缩过的包,命名为jp ...