ReactiveCocoa之RAC映射(七)

前端之家收集整理的这篇文章主要介绍了ReactiveCocoa之RAC映射(七)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
  1. -(void)map{
  2. //Map使用步骤:
  3. //1.传入一个block,类型是返回对象,参数是value
  4. //2.value就是源信号的内容,直接拿到源信号的内容做处理
  5. //3.把处理好的内容,直接返回就好了,不用包装成信号,返回的值,就是映射的值。
  6. //Map底层实现:
  7. //0.Map底层其实是调用flatternMap,Map中block中的返回的值会作为flatternMap中block中的值。
  8. //1.当订阅绑定信号,就会生成bindBlock。
  9. //3.当源信号发送内容,就会调用bindBlock(value,*stop)
  10. //4.调用bindBlock,内部就会调用flattenMap的block
  11. //5.flattenMap的block内部会调用Map中的block,把Map中的block返回的内容包装成返回的信号。
  12. //5.返回的信号最终会作为bindBlock中的返回信号,当做bindBlock的返回信号。
  13. //6.订阅bindBlock的返回信号,就会拿到绑定信号的订阅者,把处理完成的信号内容发送出来。
  14. //Map作用:把源信号的值映射成一个新的值
  15. //创建信号
  16. RACSubject*subject=[RACSubjectsubject];
  17. //绑定信号
  18. RACSignal*bindSignal=[subjectmap:^id(idvalue){
  19. //返回的类型就是你需要映射的值
  20. return[NSStringstringWithFormat:@"ws:%@",value];//这里将源信号发送的“123”前面拼接了ws:
  21. }];
  22. //订阅绑定信号
  23. [bindSignalsubscribeNext:^(idx){
  24. NSLog(@"%@",x);
  25. //发送信号
  26. [subjectsendNext:@"123"];
  27. }
  28. /*
  29. FlatternMap和Map的区别
  30. 1.FlatternMap中的Block返回信号。
  31. 2.Map中的Block返回对象。
  32. 3.开发中,如果信号发出的值不是信号,映射一般使用Map
  33. 4.开发中,如果信号发出的值是信号,映射一般使用FlatternMap。
  34. */
  35. -(void)flatMap{
  36. flattenMap:^RACStream*(//block:只要源信号发送内容就会调用
  37. //value:就是源信号发送的内容
  38. //返回信号用来包装成修改内容的值
  39. return[RACReturnSignalreturn:value];
  40. //flattenMap中返回的是什么信号,订阅的就是什么信号(那么,x的值等于value的值,如果我们操纵value的值那么x也会随之而变)
  41. //订阅信号
  42. //发送数据
  43. [subjectsendNext:@"123"];
  44. }
  45. void)flattenMap2{
  46. //flattenMap主要用于信号中的信号
  47. //signalOfsignals用FlatternMap
  48. //创建信号
  49. RACSubject*signalofSignals=[RACSubjectsubject];
  50. RACSubject*signal=[RACSubject
  51. [[signalofSignalsreturnvalue;
  52. }]idx){ //subscribeNext:调用bind 的@autoreleasepool{ } 会将subscribeNext:生成subscriber 保存到RACSubject中
  53. //发送信号
  54. [signalofSignalssendNext:signal]; // 会执行 80行的returnvalue;
  55. [signalsendNext:@"123"]; // 会执行 82行的NSLog(@"%@",x);
  56. }

猜你在找的React相关文章