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 }

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


react 中的高阶组件主要是对于 hooks 之前的类组件来说的,如果组件之中有复用的代码,需要重新创建一个父类,父类中存储公共代码,返回子类,同时把公用属性...
我们上一节了解了组件的更新机制,但是只是停留在表层上,例如我们的 setState 函数式同步执行的,我们的事件处理直接绑定在了 dom 元素上,这些都跟 re...
我们上一节了解了 react 的虚拟 dom 的格式,如何把虚拟 dom 转为真实 dom 进行挂载。其实函数是组件和类组件也是在这个基础上包裹了一层,一个是调...
react 本身提供了克隆组件的方法,但是平时开发中可能很少使用,可能是不了解。我公司的项目就没有使用,但是在很多三方库中都有使用。本小节我们来学习下如果使用该...
mobx 是一个简单可扩展的状态管理库,中文官网链接。小编在接触 react 就一直使用 mobx 库,上手简单不复杂。
我们在平常的开发中不可避免的会有很多列表渲染逻辑,在 pc 端可以使用分页进行渲染数限制,在移动端可以使用下拉加载更多。但是对于大量的列表渲染,特别像有实时数据...
本小节开始前,我们先答复下一个同学的问题。上一小节发布后,有小伙伴后台来信问到:‘小编你只讲了类组件中怎么使用 ref,那在函数式组件中怎么使用呢?’。确实我们...
上一小节我们了解了固定高度的滚动列表实现,因为是固定高度所以容器总高度和每个元素的 size、offset 很容易得到,这种场景也适合我们常见的大部分场景,例如...
上一小节我们处理了 setState 的批量更新机制,但是我们有两个遗漏点,一个是源码中的 setState 可以传入函数,同时 setState 可以传入第二...
我们知道 react 进行页面渲染或者刷新的时候,会从根节点到子节点全部执行一遍,即使子组件中没有状态的改变,也会执行。这就造成了性能不必要的浪费。之前我们了解...
在平时工作中的某些场景下,你可能想在整个组件树中传递数据,但却不想手动地通过 props 属性在每一层传递属性,contextAPI 应用而生。
楼主最近入职新单位了,恰好新单位使用的技术栈是 react,因为之前一直进行的是 vue2/vue3 和小程序开发,对于这些技术栈实现机制也有一些了解,最少面试...
我们上一节了了解了函数式组件和类组件的处理方式,本质就是处理基于 babel 处理后的 type 类型,最后还是要处理虚拟 dom。本小节我们学习下组件的更新机...
前面几节我们学习了解了 react 的渲染机制和生命周期,本节我们正式进入基本面试必考的核心地带 -- diff 算法,了解如何优化和复用 dom 操作的,还有...
我们在之前已经学习过 react 生命周期,但是在 16 版本中 will 类的生命周期进行了废除,虽然依然可以用,但是需要加上 UNSAFE 开头,表示是不安...
上一小节我们学习了 react 中类组件的优化方式,对于 hooks 为主流的函数式编程,react 也提供了优化方式 memo 方法,本小节我们来了解下它的用...
开源不易,感谢你的支持,❤ star me if you like concent ^_^
hel-micro,模块联邦sdk化,免构建、热更新、工具链无关的微模块方案 ,欢迎关注与了解
本文主题围绕concent的setup和react的五把钩子来展开,既然提到了setup就离不开composition api这个关键词,准确的说setup是由...
ReactsetState的执行是异步还是同步官方文档是这么说的setState()doesnotalwaysimmediatelyupdatethecomponent.Itmaybatchordefertheupdateuntillater.Thismakesreadingthis.staterightaftercallingsetState()apotentialpitfall.Instead,usecom