iOS开发ReactiveCocoa(四):Flattenmap和Map


峨眉山月半轮秋,影入平羌江水流。
夜发清溪向三峡,思君不见下渝州。

——李白《峨眉山月歌》

flattenMap和Map

flattenMapMap用于把源信号内容映射成新的内容

  • flattenMap简单使用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    // 监听文本框的内容改变,把结构重新映射成一个新值.
    // flattenMap作用:把源信号的内容映射成一个新的信号,信号可以是任意类型。

    // flattenMap使用步骤:
    // 1.传入一个block,block类型是返回值RACStream,参数value
    // 2.参数value就是源信号的内容,拿到源信号的内容做处理
    // 3.包装成RACReturnSignal信号,返回出去。

    // flattenMap底层实现:
    // 0.flattenMap内部调用bind方法实现的,flattenMap中block的返回值,会作为bind中bindBlock的返回值。
    // 1.当订阅绑定信号,就会生成bindBlock。
    // 2.当源信号发送内容,就会调用bindBlock(value, *stop)
    // 3.调用bindBlock,内部就会调用flattenMap的block,flattenMap的block作用:就是把处理好的数据包装成信号。
    // 4.返回的信号最终会作为bindBlock中的返回信号,当做bindBlock的返回信号。
    // 5.订阅bindBlock的返回信号,就会拿到绑定信号的订阅者,把处理完成的信号内容发送出来。

    [[_textField.rac_textSignal flattenMap:^RACStream *(id value) {

    // block什么时候 : 源信号发出的时候,就会调用这个block。
    // block作用 : 改变源信号的内容。

    // 返回值:绑定信号的内容.
    return [RACReturnSignal return:[NSString stringWithFormat:@"输出:%@",value]];

    }] subscribeNext:^(id x) {
    // 订阅绑定信号,每当源信号发送内容,做完处理,就会调用这个block。
    NSLog(@"%@",x);
    }];
  • Map简单使用:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    // 监听文本框的内容改变,把结构重新映射成一个新值.
    // Map作用:把源信号的值映射成一个新的值

    // Map使用步骤:
    // 1.传入一个block,类型是返回对象,参数是value
    // 2.value就是源信号的内容,直接拿到源信号的内容做处理
    // 3.把处理好的内容,直接返回就好了,不用包装成信号,返回的值,就是映射的值。

    // Map底层实现:
    // 0.Map底层其实是调用flatternMap,Map中block中的返回的值会作为flatternMap中block中的值。
    // 1.当订阅绑定信号,就会生成bindBlock。
    // 3.当源信号发送内容,就会调用bindBlock(value, *stop)
    // 4.调用bindBlock,内部就会调用flattenMap的block
    // 5.flattenMap的block内部会调用Map中的block,把Map中的block返回的内容包装成返回的信号。
    // 5.返回的信号最终会作为bindBlock中的返回信号,当做bindBlock的返回信号。
    // 6.订阅bindBlock的返回信号,就会拿到绑定信号的订阅者,把处理完成的信号内容发送出来。

    [[_textField.rac_textSignal map:^id(id value) {
    // 当源信号发出,就会调用这个block,修改源信号的内容
    // 返回值:就是处理完源信号的内容。
    return [NSString stringWithFormat:@"输出:%@",value];
    }] subscribeNext:^(id x) {
    NSLog(@"%@",x);
    }];

FlatternMap和Map的区别

  • FlatternMap中的Block返回信号。
  • Map中的Block返回对象。
  • 开发中,如果信号发出的值不是信号,映射一般使用Map
  • 开发中,如果信号发出的值是信号,映射一般使用FlatternMap
    • 总结:signalOfsignals用FlatternMap
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// 创建信号中的信号
RACSubject *signalOfsignals = [RACSubject subject];
RACSubject *signal = [RACSubject subject];

[[signalOfsignals flattenMap:^RACStream *(id value) {
// 当signalOfsignals的signals发出信号才会调用
return value;
}] subscribeNext:^(id x) {

// 只有signalOfsignals的signal发出信号才会调用,因为内部订阅了bindBlock中返回的信号,也就是flattenMap返回的信号。
// 也就是flattenMap返回的信号发出内容,才会调用。
NSLog(@"%@aaa",x);
}];

// 信号的信号发送信号
[signalOfsignals sendNext:signal];
// 信号发送内容
[signal sendNext:@1];
要不要鼓励一下😘