RAC随笔

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);
    }];
}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • RAC使用测试Demo下载:github.com/FuWees/WPRACTestDemo 1.ReactiveC...
    FuWees阅读 6,526评论 3 10
  • 1.ReactiveCocoa简介 ReactiveCocoa(简称RAC),是由Github开源的一个应用于IO...
    雷晏阅读 1,192评论 4 15
  • 前言由于公司需使用RAC+MVVM模式要写业务逻辑,对于rac菜鸡的我,不得不补习下功课,在RAC中,万物皆信号。...
    flowerflower阅读 5,220评论 19 18
  • 关于Mongodb的全面总结 MongoDB的内部构造《MongoDB The Definitive Guide》...
    中v中阅读 32,077评论 2 89
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,161评论 1 32