1、distinctUntilChanged:两次信号不同,才会订阅到。
[[[self.textFild rac_textSignal] distinctUntilChanged] subscribeNext:^(id x) {
NSLog(@"%@", x);
}];
2、throttle:截流
[[[self.textField rac_textSignal] throttle:1] subscribeNext:^(id x) {
NSLog(@"%@", x);//超过1秒textField的值,只要不变,就会订阅到,1秒内如果值一直在变,就订阅不到,即两次输入值的间隔不超过1秒,就不会订阅到,两次输入值的间隔超过1秒,就会订阅到
}];
[[[RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
[subscriber sendNext:@"1"];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[subscriber sendNext:@"2"];
[subscriber sendNext:@"3"];
[subscriber sendNext:@"4"];
});
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[subscriber sendNext:@"5"];
[subscriber sendNext:@"6"];
});
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
[subscriber sendNext:@"7"];
});
return nil;
}] throttle:1] subscribeNext:^(id x) {
NSLog(@"输出:%@",x);//输出:1,4,6,7
}];
// 当某个信号发送比较频繁时,可以使用节流,在某一段时间不发送信号内容,过了一段时间获取信号的最新内容发出。
3、ReplaySubject - 手动回放控制信号 - RACReplaySubject
表示可以手动控制信号,底层实现和RACSubject不一样,它会先把值保存起来,然后遍历刚刚保存的所有订阅者,一个一个调用订阅者的nextBlock然后调用subscribeNext订阅信号,遍历保存的所有值,一个一个调用订阅者的nextBlock。
可以有以下两种处理流程:
处理流程 1:创建信号-订阅信号-发送信号(和Subjects一样)
处理流程 2:创建信号-发送信号-订阅信号
RACReplaySubject可以先发送信号,在订阅信号,RACSubject就不可以
使用场景一:如果一个信号每被订阅一次,就需要把之前的值重复发送一遍,使用重复提供信号类。
使用场景二:可以设置capacity数量来限制缓存的value的数量,即只缓充最新的几个值。
// 1.创建信号
// 第一种情况
// RACReplaySubject *replaySubject = [RACReplaySubject subject];
// 第二种情况 只缓存最新的一个
// RACReplaySubject *replaySubject = [RACReplaySubject replaySubjectWithCapacity:1];
// RACSubject *replaySubject = [RACSubject subject];
// // 2.发送信号
[replaySubject sendNext:@"1"];
[replaySubject sendNext:@"2"];
// // 订阅 几次接收几次
// // 3.订阅信号 First
[replaySubject subscribeNext:^(id x) {
NSLog(@"FirstSubscribeNext%@",x);
}];
// // 3.订阅信号 Second
[replaySubject subscribeNext:^(id x) {
NSLog(@"SecondSubscribeNext%@",x);
}];
// [replaySubject sendNext:@"1"];
// [replaySubject sendNext:@"2"];
4、startWith:占位
刚开始用 da引导页4.png 四秒种后用da引导页2.png
RAC(self.img,image) = [[[RACSignal return:[UIImage imageNamed:@"da引导页2.png"]] delay:4] startWith:[UIImage imageNamed:@"da引导页4.png"]];
5、takeWhileBlock:返回YES可以订阅到,返回NO订阅不到。 skipWhileBlock:返回YES跳过不可以订阅到,返回NO没有跳过可以订阅到 skipUntilBlock:返回YES跳过不可以订阅到,返回NO没有跳过可以订阅到 repeatWhileBlock
RACSignal *signal = [[RACSignal createSignal:^RACDisposable * _Nullable(id<RACSubscriber> _Nonnull subscriber) {
NSLog(@"今天天气很好");
// sleep(2);
[subscriber sendNext:@"开心每一天"];
[subscriber sendCompleted];
// [subscriber sendError:[NSError errorWithDomain:NSURLErrorDomain code:1000 userInfo:nil]];
[subscriber sendNext:@"哈哈哈哈哈哈哈"];
// [subscriber sendCompleted];
return [RACDisposable disposableWithBlock:^{
NSLog(@"销毁");
}];
}] skipUntilBlock:^BOOL(id _Nullable x) {
NSLog(@"skipUntilBlock:%@",x);
return YES;
}];
// [signal subscribeNext:^(id _Nullable x) {
// NSLog(@"%@",x);
// }];
[signal subscribeNext:^(id _Nullable x) {
NSLog(@"%@",x);
} error:^(NSError * _Nullable error) {
NSLog(@"发送失败");
} completed:^{
NSLog(@"发送成功");
}];
6、
网友评论