加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ReactiveCocoa之RAC合并(九)

发布时间:2020-12-15 08:22:43 所属栏目:百科 来源:网络整理
导读:@interface ViewController() @property (weak, nonatomic )IBOutlet UITextField *accountField; UITextField *pwdField; UIButton *loginBtn; @end @implementation ViewController -( void )viewDidLoad{ [ super viewDidLoad ]; //Doanyadditionalsetupa
  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 }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读