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:以下是参考别的文章拿来的解释
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返回结果之前,先执行你自己的方法,改变结果的输出