1、信号创建
image.png
2、信号订阅
image.png
3、单个信号的变换
image.png
3.1 值操作
image.png
image.png
image.png
3.2 数量操作
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
3.3 时间操作
image.png
image.png
4 多个信号操作
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
4、信号的高阶操作
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
5、冷信号和热信号
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
image.png
6、RAC并发编程
image.png
image.png
image.png
image.png
image.png
image.png
7、RACChannel 双向绑定
image.png
image.png
image.png
RACChannelTo(view, property) = RACChannelTo(model, property);
等价于
[[RACKVOChannel alloc] initWithTarget:view keyPath:@"property" nilValue:nil][@"followingTerminal"] = [[RACKVOChannel alloc] initWithTarget:model keyPath:@"property" nilValue:nil][@"followingTerminal"];
[[RACKVOChannel alloc] initWithTarget:[NSUserDefaults standardUserDefaults]
keyPath:@"someBoolKey" nilValue:@(NO)][@"followingTerminal"] = [[RACKVOChannel alloc] initWithTarget:self.someSwitch keyPath:@"on" nilValue:@(NO)][@"followingTerminal"];
// 上面的不能完全实现双向绑定,因为 UISwitch 的 on 属性是不支持 KVO 的
@weakify(self)
[self.someSwitch.rac_newOnChannel subscribeNext:^(NSNumber *onValue) {
@strongify(self)
// 下面两句都可以
[self.someSwitch setValue:onValue forKey:@"on"];
//[[NSUserDefaults standardUserDefaults] setObject:onValue forKey:@"someBoolKey"];
}];
8、其它
-
1、RACSignal
image-20230424133128972.png -
2、RACSubject
RACSubject,必须先订阅者,再发送信号,这时订阅者才能收到信号
image-20230424134713167.png -
3、RACReplaySubject
RACReplaySubject : 可以先发送信号,再有订阅者,
image-20230424141457007.png -
4、RAC集合类
image-20230424142103719.png
image-20230424142524302.png
image-20230424142933253.png
image-20230424143459724.png
- 5、代替代理:直接监听SEL
image-20230424144219609.png
- 6、代替KVO
image-20230424151537311.png
-
7、代替点击事件
image-20230424151747805.png -
8、代替通知
image-20230424151959944.png -
9、监听文本框输入
image-20230424152228491.png -
10、定时器
image.png -
11、信号同步
image.png -
12、RACMulticastConnection
RACMulticastConnection:当有多个订阅时,只需要发送一次信号
RACSignal : 当有多个订阅者的时候,信号会多次发送。
image-20230425011635739.png -
13、RACCommand
image-20230425013055761.png
image-20230425015421613.png
image-20230425015907469.png -
14、bind
image-20230426010146979.png
15、then
信号A 和信号B,当A信号发送完毕后,才轮到信号B,A的数据并没有被订阅处理,只会订阅处理B数据
image-20230505005618435.png
16、信号过滤
// 跳跃 : 如下,skip传入2 跳过前面两个值
// 实际用处: 在实际开发中比如 后台返回的数据前面几个没用,我们想跳跃过去,便可以用skip
- (void)skip {
RACSubject *subject = [RACSubject subject];
[[subject skip:2] subscribeNext:^(id x) {
NSLog(@"%@", x);
}];
[subject sendNext:@1];
[subject sendNext:@2];
[subject sendNext:@3];
}
//distinctUntilChanged:-- 如果当前的值跟上一次的值一样,就不会被订阅到
- (void)distinctUntilChanged {
RACSubject *subject = [RACSubject subject];
[[subject distinctUntilChanged] subscribeNext:^(id x) {
NSLog(@"%@", x);
}];
// 发送信号
[subject sendNext:@1];
[subject sendNext:@2];
[subject sendNext:@2]; // 不会被订阅
}
// take:可以屏蔽一些值,去前面几个值---这里take为2 则只拿到前两个值
- (void)take {
RACSubject *subject = [RACSubject subject];
[[subject take:2] subscribeNext:^(id x) {
NSLog(@"%@", x);
}];
// 发送信号
[subject sendNext:@1];
[subject sendNext:@2];
[subject sendNext:@3];
}
//takeLast:和take的用法一样,不过他取的是最后的几个值,如下,则取的是最后两个值
//注意点:takeLast 一定要调用sendCompleted,告诉他发送完成了,这样才能取到最后的几个值
- (void)takeLast {
RACSubject *subject = [RACSubject subject];
[[subject takeLast:2] subscribeNext:^(id x) {
NSLog(@"%@", x);
}];
// 发送信号
[subject sendNext:@1];
[subject sendNext:@2];
[subject sendNext:@3];
[subject sendCompleted];
}
// takeUntil:---给takeUntil传的是哪个信号,那么当这个信号发送信号或sendCompleted,就不能再接受源信号的内容了。
- (void)takeUntil {
RACSubject *subject = [RACSubject subject];
RACSubject *subject2 = [RACSubject subject];
[[subject takeUntil:subject2] subscribeNext:^(id x) {
NSLog(@"%@", x);
}];
// 发送信号
[subject sendNext:@1];
[subject sendNext:@2];
[subject2 sendNext:@3]; // 1
// [subject2 sendCompleted]; // 或2
[subject sendNext:@4];
}
// ignore: 忽略掉一些值
- (void)ignore {
//ignore:忽略一些值
//ignoreValues:表示忽略所有的值
// 1.创建信号
RACSubject *subject = [RACSubject subject];
// 2.忽略一些值
RACSignal *ignoreSignal = [subject ignore:@2]; // ignoreValues:表示忽略所有的值
// 3.订阅信号
[ignoreSignal subscribeNext:^(id x) {
NSLog(@"%@", x);
}];
// 4.发送数据
[subject sendNext:@2];
}
// 一般和文本框一起用,添加过滤条件
- (void)fliter {
// 只有当文本框的内容长度大于5,才获取文本框里的内容
[[self.textField.rac_textSignal filter:^BOOL(id value) {
// value 源信号的内容
return [value length] > 5;
// 返回值 就是过滤条件。只有满足这个条件才能获取到内容
}] subscribeNext:^(id x) {
NSLog(@"%@", x);
}];
}