ReactiveCocoa之RAC映射(七)

来源:互联网 发布:猪八戒出题软件破解 编辑:程序博客网 时间:2024/05/18 01:40
  1. - (void)map {  
  2.       
  3.     // Map使用步骤:  
  4.     // 1.传入一个block,类型是返回对象,参数是value  
  5.     // 2.value就是源信号的内容,直接拿到源信号的内容做处理  
  6.     // 3.把处理好的内容,直接返回就好了,不用包装成信号,返回的值,就是映射的值。  
  7.       
  8.     // Map底层实现:  
  9.     // 0.Map底层其实是调用flatternMap,Map中block中的返回的值会作为flatternMap中block中的值。  
  10.     // 1.当订阅绑定信号,就会生成bindBlock。  
  11.     // 3.当源信号发送内容,就会调用bindBlock(value, *stop)  
  12.     // 4.调用bindBlock,内部就会调用flattenMap的block  
  13.     // 5.flattenMap的block内部会调用Map中的block,把Map中的block返回的内容包装成返回的信号。  
  14.     // 5.返回的信号最终会作为bindBlock中的返回信号,当做bindBlock的返回信号。  
  15.     // 6.订阅bindBlock的返回信号,就会拿到绑定信号的订阅者,把处理完成的信号内容发送出来。  
  16.       
  17.       
  18.       
  19.     // Map作用:把源信号的值映射成一个新的值  
  20.     // 创建信号  
  21.     RACSubject *subject = [RACSubject subject];  
  22.     // 绑定信号  
  23.     RACSignal *bindSignal = [subject map:^id(id value) {  
  24.           
  25.         // 返回的类型就是你需要映射的值  
  26.         return [NSString stringWithFormat:@"ws:%@", value]; //这里将源信号发送的“123” 前面拼接了ws:  
  27.     }];  
  28.     // 订阅绑定信号  
  29.     [bindSignal subscribeNext:^(id x) {  
  30.         NSLog(@"%@", x);  
  31.     }];  
  32.     // 发送信号  
  33.     [subject sendNext:@"123"];  
  34.   
  35. }  
  36.   
  37. /* 
  38.  FlatternMap和Map的区别 
  39.   
  40.  1.FlatternMap中的Block返回信号。 
  41.  2.Map中的Block返回对象。 
  42.  3.开发中,如果信号发出的值不是信号,映射一般使用Map 
  43.  4.开发中,如果信号发出的值是信号,映射一般使用FlatternMap。 
  44.  */  
  45.   
  46.   
  47.   
  48. - (void)flatMap {  
  49.       
  50.     // 创建信号  
  51.     RACSubject *subject = [RACSubject subject];  
  52.     // 绑定信号  
  53.     RACSignal *bindSignal = [subject flattenMap:^RACStream *(id value) {  
  54.         // block:只要源信号发送内容就会调用  
  55.         // value: 就是源信号发送的内容  
  56.         // 返回信号用来包装成修改内容的值  
  57.         return [RACReturnSignal return:value];  
  58.           
  59.     }];  
  60.       
  61.     // flattenMap中返回的是什么信号,订阅的就是什么信号(那么,x的值等于value的值,如果我们操纵value的值那么x也会随之而变)  
  62.     // 订阅信号  
  63.     [bindSignal subscribeNext:^(id x) {  
  64.         NSLog(@"%@", x);  
  65.     }];  
  66.       
  67.     // 发送数据  
  68.     [subject sendNext:@"123"];  
  69.       
  70. }  
  71.   
  72. - (void)flattenMap2 {  
  73.     // flattenMap 主要用于信号中的信号  
  74.      //signalOfsignals用FlatternMap  
  75.     // 创建信号  
  76.     RACSubject *signalofSignals = [RACSubject subject];  
  77.     RACSubject *signal = [RACSubject subject];  

  78.     [[signalofSignals flattenMap:^RACStream *(id value) {  
  79.         return value;  
  80.     }] subscribeNext:^(id x) { // subscribeNext:调用bind 的@autoreleasepool{  } 会将subscribeNext:生成的subscriber 保存到RACSubject中
  81.         NSLog(@"%@", x);  
  82.     }];  
  83.       
  84.     // 发送信号  
  85.     [signalofSignals sendNext:signal];  // 会执行 80行的 return value; 
  86.     [signal sendNext:@"123"];  // 会执行 82行的 NSLog(@"%@", x);
  87. }  
0 0
原创粉丝点击