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
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
手机扫一扫
移动阅读更方便
你可能感兴趣的文章