ReactiveCocoa之RAC合并(九)

  1. @interfaceViewController()
  2. @property(weak,nonatomic)IBOutletUITextField*accountField;
  3. UITextField*pwdField;
  4. UIButton*loginBtn;
  5. @end
  6. @implementationViewController
  7. -(void)viewDidLoad{
  8. [superviewDidLoad];
  9. //Doanyadditionalsetupafterloadingtheview,typicallyfromanib.
  10. selfconcat];
  11. }
  12. //把多个信号聚合成你想要的信号,使用场景----:比如-当多个输入框都有值的时候按钮才可点击。
  13. //思路---就是把输入框输入值的信号都聚合成按钮是否能点击的信号。
  14. -(void)combineLatest{
  15. RACSignal*combinSignal=[RACSignalcombineLatest:@[self.accountField.rac_textSignal,153); background-color:inherit; font-weight:bold">self.pwdField.rac_textSignal]reduce:^id(Nsstring*account,153); background-color:inherit; font-weight:bold">Nsstring*pwd){//reduce里的参数一定要和combineLatest数组里的一一对应。
  16. //block:只要源信号发送内容,就会调用,组合成一个新值。
  17. NSLog(@"%@%@",account,pwd);
  18. return@(account.length&&pwd.length);
  19. }];
  20. ////订阅信号
  21. //[combinSignalsubscribeNext:^(idx){
  22. //self.loginBtn.enabled=[xboolValue];
  23. //}];//----这样写有些麻烦,可以直接用RAC宏
  24. RAC(self.loginBtn,enabled)=combinSignal;
  25. /*
  26. RACSignal*signal=[RACSignalcombineLatest:@[self.accountField.rac_textSignal,self.pwdField.rac_textSignal]reduce:^id(Nsstring*string1,Nsstring*string2){
  27. return@(string1.length&&string2.length);
  28. }];
  29. RAC(self.loginBtn,selected)=signal;
  30. */
  31. }
  32. void)zipwith{
  33. //zipwith:把两个信号压缩成一个信号,只有当两个信号同时发出信号内容时,并且把两个信号的内容合并成一个元祖,才会触发压缩流的next事件。
  34. //创建信号A
  35. RACSubject*signalA=[RACSubjectsubject];
  36. //创建信号B
  37. RACSubject*signalB=[RACSubject//压缩成一个信号
  38. //**-zipwith-**:当一个界面多个请求的时候,要等所有请求完成才更新UI
  39. //等所有信号都发送内容的时候才会调用
  40. RACSignal*zipSignal=[signalAzipwith:signalB];
  41. [zipSignalsubscribeNext:^(idx){
  42. NSLog(@"%@",x);//所有的值都被包装成了元组
  43. //发送信号交互顺序,元组内元素的顺序不会变,跟发送的顺序无关,而是跟压缩的顺序有关[signalAzipwith:signalB]---先是A后是B
  44. [signalAsendNext:@1];
  45. [signalB@2];
  46. //任何一个信号请求完成都会被订阅
  47. //merge:多个信号合并成一个信号,任何一个信号有新值就会调用
  48. void)merge{
  49. //创建信号A
  50. subject];
  51. //创建信号B
  52. //组合信号
  53. RACSignal*mergeSignal=[signalAmerge:signalB];
  54. //订阅信号
  55. [mergeSignal//发送信号---交换位置则数据结果顺序也会交换
  56. sendNext:@"下部分"];
  57. sendNext:@"上部分"];
  58. //then---使用需求:有两部分数据:想让上部分先进行网络请求但是过滤掉数据,然后进行下部分的,拿到下部分数据
  59. void)then{
  60. RACSignal*signalA=[RACSignalcreateSignal:^RACdisposable*(id<RACSubscriber>subscriber){
  61. //发送请求
  62. NSLog(@"----发送上部分请求---afn");
  63. [subscribersendNext:@"上部分数据"];
  64. [subscribersendCompleted];//必须要调用sendCompleted方法
  65. returnnil;
  66. //创建信号B,
  67. RACSignal*signalsB=[RACSignal NSLog(@"--发送下部分请求--afn");
  68. sendNext:@"下部分数据"];
  69. sendCompleted];
  70. nil;
  71. }];
  72. //创建组合信号
  73. //then;忽略掉第一个信号的所有值
  74. RACSignal*thenSignal=[signalAthen:^RACSignal*{
  75. //返回的信号就是要组合的信号
  76. returnsignalsB;
  77. [thenSignal//concat-----使用需求:有两部分数据:想让上部分先执行,完了之后再让下部分执行(都可获取值)
  78. void)concat{
  79. //组合
  80. //NSLog(@"----发送上部分请求---afn");
  81. //NSLog(@"--发送下部分请求--afn");
  82. //concat:按顺序去链接
  83. //**-注意-**:concat,第一个信号必须要调用sendCompleted
  84. //创建组合信号
  85. RACSignal*concatSignal=[signalAconcat:signalsB];
  86. //订阅组合信号
  87. [concatSignal }

相关文章

一、前言 在组件方面react和Vue一样的,核心思想玩的就是组件...
前言: 前段时间学习完react后,刚好就接到公司一个react项目...
前言: 最近收到组长通知我们项目组后面新开的项目准备统一技...
react 中的高阶组件主要是对于 hooks 之前的类组件来说的,如...
我们上一节了解了组件的更新机制,但是只是停留在表层上,例...
我们上一节了解了 react 的虚拟 dom 的格式,如何把虚拟 dom...