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返回结果之前,先执行你自己的方法,改变结果的输出