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: schedule:^{
NSLog(@"--------%@",[RACScheduler currentScheduler]);
}];
实际使用可以用来做延迟的操作。。。。。
3:以下是参考别的文章拿来的解释
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返回结果之前,先执行你自己的方法,改变结果的输出
rac 关于RACScheduler的一点学习的更多相关文章
- 关于Set和Map数据结构的一点学习
关于js的Set和Map结构的学习和记录 对阮一峰老师的ES6入门和网上有关资料的的一点学习和记录 1.Set数据结构 Set构造函数的参数是一个可遍历( iterator)对象 Set中的成员值是唯 ...
- Vagrant 安装Oracle19c RAC测试环境的简单学习
1. 学习自网站: https://xiaoyu.blog.csdn.net/article/details/103135158 简单学习了下 能够将oracle RAC开起来了 但是 对后期的维护和 ...
- FloatingActionButton的一点学习感悟
最近在学习android材料设计的新控件,前面一篇文章讲到 CoordinatorLayout 结合几个新控件可以实现的几个效果.其中第一个是,Coordinatorlayout + Floating ...
- 嵌入式Linux的一点学习心得
Linux本身是一个发展中的操作系统.它有很多前期不完善的机制,被后代用新的机制代替.但是老的机制不可能一下子就消亡,因此由于“历史原因”,会产生很多新旧机制共存的情况.而且Linux的教科书数不胜数 ...
- 关于 truncate table 的一点学习札记
---下面整理笔记来之 itpub 的各位前辈的语录.这里做了一个汇总.仅供学习. truncate table后,oracle会回收表和其表中所在的索引到initial 大小,也就是初始分配的seg ...
- numpy的一点学习
1.Numpy模块 NumPy是Python中的一个运算速度非常快的一个数学库,它非常重视数组.它允许你在Python中进行向量和矩阵计算,并且由于许多底层函数实际上是用C编写的,因此你可以体验在原生 ...
- javascript的一点学习
最近用vue.js用的很爽,在全栈开发的路上一路狂奔,发现后台跟前台一起确实更有意义. 记录一个比较有意思的bug: 目标是对一个全局的paramList进行json格式化显示.代码借鉴了 http: ...
- AngularJS的一点学习笔记
ng-options="item.action for item in todos" ng-options表达式的基本形式, 形如 "<标签> for < ...
- fork 函数的一点学习
昨天某位少年问了我一个问题,#include<stdio.h> int main() { fork(); fork(); fork(); printf("hello " ...
随机推荐
- Collection集合常用的功能
package demo06; import java.util.ArrayList;import java.util.Collection; /** java.util接口 Collection&l ...
- [Agc029B]Powers of two_贪心_树形dp
Powers of two 题目链接:https://atcoder.jp/contests/agc029/tasks/agc029_b 数据范围:略. 题解: 可能一点思路都没有. 但是我们发现:如 ...
- ibox 的使用
<div class="ibox float-e-margins"> <div class="ibox-title"> <h5&g ...
- PHP身份证验证
/** * 身份证号码验证(真正要调用的方法) * @param $id_card 身份证号码 */function validation_filter_id_card($id_card){ if ( ...
- Java手写简单HashMap一(包括增加,查找,toString,泛型)
@Java 300 学习总结 HashMap底层采用实现采用了哈希表,结合了"数组和链表". 原理如图 一.定义HashMap类. 首先需要定义一个节点来存储数据,构成链表结构. ...
- taskverse学习
简介 taskverse是<linux二进制分析>一书作者编写的一个隐藏进程的检测工具,它使用/proc/kcore来访问内核内存,github的地址在这里:https://github. ...
- Educational Codeforces Round 71 (Rated for Div. 2) Solution
A. There Are Two Types Of Burgers 题意: 给一些面包,鸡肉,牛肉,你可以做成鸡肉汉堡或者牛肉汉堡并卖掉 一个鸡肉汉堡需要两个面包和一个鸡肉,牛肉汉堡需要两个面包和一个 ...
- 图数据库-Neo4j-常用算法
本次主要学习图数据库中常用到的一些算法,以及如何在Neo4j中调用,所以这一篇偏实战,每个算法的原理就简单的提一下. 1. 图数据库中常用的算法 PathFinding & Search 一般 ...
- CCF - CCSP 2018-01 绝地求生 BFS
BFS从安全地区方向搞一下就好了 1.还是注意每回合清空 2.posx居然开小了,可不能犯这种错误 3.地图用a和节点的dis重名了,建议其他变量禁止用a命名 4.在输入数据之前continue了,这 ...
- php对象转换为数组的部分代码
function object_array($array){ if(is_object($array)){ $array = (array)$array; } if(is_array($array)) ...