ReactiveCocoa之常见用法(二)

前端之家收集整理的这篇文章主要介绍了ReactiveCocoa之常见用法(二)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

ReactiveCocoa开发中常见用法

代替代理:

rac_signalForSelector:用于替代代理。

代替KVO :

rac_valuesAndChangesForKeyPath:用于监听某个对象的属性改变。

监听事件:

rac_signalForControlEvents:用于监听某个事件。

代替通知:

rac_addObserverForName:用于监听某个通知

监听文本框文字改变:

rac_textSignal:只要文本框发出改变就会发出这个信号。

处理当界面有多次请求时,需要都获取到数据时,才能展示界面

rac_liftSelector:withSignalsFromArray:Signals:当传入的Signals(信号数组),每一个signal都至少sendNext过一次,就会去触发第一个selector参数的方法

使用注意:几个信号,参数一的方法就几个参数,每个参数对应信号发出的数据。


温馨提示:Demo用到的第三方

导入的第三方框架

pod 'ReactiveCocoa','~> 2.5'

pod 'Masonry','~> 0.6.4'

pod 'LxDBAnything','1.1.0'


代码

@weakify(Obj)和@strongify(Obj),一般两个都是配套使用,在主头文件(ReactiveCocoa.h)中并没有导入,需要自己手动导入,RACEXTScope.h才可以使用。但是每次导入都非常麻烦,只需要在主头文件自己导入就好了。

[objc] view plain copy
  1. /*************************************基础部分**************************************************/
  2. #pragmamark--textField属性变化
  3. -(void)textFieldChange
  4. {
  5. //初始化一个textField控件
  6. UITextField*textField=({
  7. UITextField*textField=[[UITextFieldalloc]init];
  8. textField.backgroundColor=[UIColorcyanColor];
  9. textField;
  10. });
  11. textField.delegate=self;
  12. [self.viewaddSubview:textField];
  13. @weakify(self);
  14. [textFieldmas_makeConstraints:^(MASConstraintMaker*make){
  15. @strongify( make.size.mas_equalTo(CGSizeMake(180,40));
  16. make.center.equalTo(self.view);
  17. }];
  18. /*****************监听textField的属性变化情况*******************/
  19. //RAC内部封装好的类
  20. //默认执行1次,所以会有打印,原因:请查看RAC底层bind,hook的思想
  21. //监听文本框的文字改变
  22. [textField.rac_textSignalsubscribeNext:^(idx){
  23. LxDBAnyVar(x);
  24. }
  25. #pragmamark--Button用法监听事件
  26. void)textBtn
  27. UIButton*button=[UIButtonbuttonWithType:UIButtonTypeSystem];
  28. [buttonsetTitle:@"点击"forState:UIControlStateNormal];
  29. button.backgroundColor=[UIColorredColor];
  30. [addSubview:button];
  31. [button make.size.mas_equalTo(CGSizeMake(self.view.bounds.size.width,30));
  32. make.bottom.equalTo(self.view).offset(0);
  33. //监听事件
  34. //把按钮点击事件转换为信号,点击按钮,就会发送信号
  35. [[buttonrac_signalForControlEvents:UIControlEventTouchUpInside]idx){
  36. LxPrintf(@"进来了");
  37. RACViewController*VC=[[RACViewControllerinit];
  38. selfpresentViewController:VCanimated:YEScompletion:^{
  39. LxPrintf(@"%s",__func__);
  40. #pragmamark--手势
  41. void)addTap
  42. /**************手势*****************/
  43. self.view.userInteractionEnabled=YES;
  44. UITapGestureRecognizer*tap=[[UITapGestureRecognizer [[taprac_gestureSignal] LxDBAnyVar(x);
  45. }];
  46. addGestureRecognizer:tap];
  47. #pragmamark--通知中心
  48. -(void)notifiCenter
  49. {
  50. /**************通知*****************/
  51. [[[NSNotificationCenterdefaultCenter]rac_addObserverForName:UIApplicationDidEnterBackgroundNotificationobject:nil] #pragmamark--代理
  52. void)delegateDemo
  53. UIAlertView*alterView=[[UIAlertViewinitWithTitle:@"RAC"message:@"ReactiveCocoa"delegate:cancelButtonTitle:@"Cancel"otherButtonTitles:@"Ensure",nilnil];
  54. //方法一:代理
  55. //[[selfrac_signalForSelector:@selector(alertView:clickedButtonAtIndex:)fromProtocol:@protocol(UIAlertViewDelegate)]subscribeNext:^(idx){
  56. //
  57. //RACTuple*tuple=(RACTuple*)x;//类似于swift的元组
  58. //LxDBAnyVar(tuple);
  59. //LxDBAnyVar(tuple.first);
  60. //LxDBAnyVar(tuple.second);
  61. //LxDBAnyVar(tuple.third);
  62. //}];
  63. [alterViewshow];
  64. //方法二:内部封装的方法
  65. //更简单的方式
  66. [[alterViewrac_buttonClickedSignal] }
  67. #pragmamark--KVO
  68. void)addKvo
  69. UIScrollView*scrollView=[[UIScrollView scrollView.delegate=(id<UIScrollViewDelegate>)self;
  70. addSubview:scrollView];
  71. UIView*scrollViewContentView=[[UIView scrollViewContentView.backgroundColor=[UIColoryellowColor];
  72. [scrollViewaddSubview:scrollViewContentView];
  73. self);
  74. [scrollView make.edges.equalTo(self.view).insets(UIEdgeInsetsMake(80,80,80));
  75. [scrollViewContentView make.edges.equalTo(scrollView);
  76. make.size.mas_equalTo(CGRectGetWidth(self.view.frame),CGRectGetHeight(self.view.frame));
  77. [RACObserve(scrollView,contentOffset)//处理当界面有多次请求时,需要都获取到数据时,才能展示界面
  78. void)moreRequest
  79. /*
  80. 1.rac_liftSelector:withSignalsFromArray:Signals:当传入的Signals(信号数组),每一个signal都至少sendNext过一次,就会去触发第一个selector参数的方法
  81. 2.使用注意:几个信号,参数一的方法就几个参数,每个参数对应信号发出的数据。
  82. */
  83. //处理多个请求,都返回结果的时候,统一做处理.
  84. RACSignal*request1=[RACSignalcreateSignal:^RACDisposable*(id<RACSubscriber>subscriber){
  85. //发送请求1
  86. [subscribersendNext:@"发送请求1"];
  87. returnnil;
  88. RACSignal*request2=[RACSignalid<RACSubscriber>subscriber){
  89. //发送请求2
  90. sendNext:@"发送请求2"];
  91. //使用注意:几个信号,参数一的方法就几个参数,每个参数对应信号发出的数据。
  92. rac_liftSelector:@selector(updateUIWithR1:r2:)withSignalsFromArray:@[request1,request2]];
  93. //更新UI
  94. void)updateUIWithR1:(id)datar2:(id)data1
  95. NSLog(@"更新UI%@%@",data,data1);
  96. #pragmamark--定时器
  97. void)RACSchedulerAndMain
  98. /**************定时器*****************/
  99. //1.延迟某个时间再做某件事
  100. //[[RACSchedulermainThreadScheduler]afterDelay:2schedule:^{
  101. //LxDBAnyVar(rac);
  102. //2.每间隔多长时间做一件
  103. [[RACSignalinterval:1onScheduler:[RACSchedulermainThreadScheduler]]//LxPrintAnything(@"55555555");
  104. //这是定时器最常用的两种方法,第一种方法,延迟时间去做某件事,更改afterDelay的属性,第二种方法,每间隔躲藏时间去做一件事,更改interval的属性
  105. }

猜你在找的React相关文章