ReactiveCocoa 学习笔记十五(RACSignalSupport)

RACSignalSupport

RACSignalSupport 是 ReactiveCocoa 框架中为 CocoaTouch 框架中的一些类声明的扩展类,其旨在为这些类添加信号流的特性。

  1. 视图的重用

    • MKAnnotationView (RACSignalSupport)
    • UICollectionReusableView (RACSignalSupport)
    • UITableViewCell (RACSignalSupport)
    • UITableViewHeaderFooterView (RACSignalSupport)

    当上面类的实例对象调用 prepareForReuse 方法时,扩展的属性 rac_prepareForReuseSignal 作为信号流便会传递一个 RACUnit 信号量。

    @property (nonatomic, strong, readonly) RACSignal<RACUnit *> *rac_prepareForReuseSignal;
    

    通常,使用该属性来取消订阅者的订阅,因为当控件被重用时,可能会再次对该信号流进行订阅,如果不取消前一次进行的订阅,那么可能造成重复的订阅或错误的订阅。

    使用方式如下:

    [[[self.cancelButton
         rac_signalForControlEvents:UIControlEventTouchUpInside]
         takeUntil:self.rac_prepareForReuseSignal]
         subscribeNext:^(UIButton *x) {
             // do other things
         }];
    

    self.rac_prepareForReuseSignal 发出信号量时,即视图被重用,那么该按钮不再响应原定的操作。当然,重用时,会为该按钮绑定新的任务。

    RACUnit 是 ReactiveCocoa 框架为了表示空信号量而声明的类,使用时应调用其类方法 defaultUnit 获取全局对象。

  2. UIActionSheet (RACSignalSupport)

    该分类提供了一个方法返回一个信号流,该信号流传递的信号量是选择点击 UIActionSheet 中的按钮索引,由此可以推断出点击的是哪个按钮,而进行相应的任务。

    @property (nonatomic, strong, readonly) RACDelegateProxy *rac_delegateProxy;
    
    - (RACSignal<NSNumber *> *)rac_buttonClickedSignal;
    

    当调用 rac_buttonClickedSignal 方法时,rac_delegateProxy 属性会成为 UIActionSheet 实例对象的代理,而其原本的代理会赋值给 rac_delegateProxy 的属性 rac_proxiedDelegate ,所有 rac_delegateProxy 无法处理的消息都会转给 rac_proxiedDelegate 处理。

    所以如果是在调用了 rac_buttonClickedSignal 方法之后,对当前对象的 delegate 进行赋值,那么 rac_buttonClickedSignal 将不会传递按钮索引。

  3. UIAlertView (RACSignalSupport)

    @property (nonatomic, strong, readonly) RACDelegateProxy *rac_delegateProxy;
    
    - (RACSignal<NSNumber *> *)rac_buttonClickedSignal;
    
    - (RACSignal<NSNumber *> *)rac_willDismissSignal;
    

    该分类同 UIActionSheet (RACSignalSupport) 类似,rac_buttonClickedSignal 会传递点击的按钮的索引,而 rac_willDismissSignal 会传递使视图消失的按钮的索引。

  4. UIControl (RACSignalSupport)

    使用 rac_signalForControlEvents 方法,可以获取一个信号流,当控件指定的事件触发时,该信号流便会将与该事件相关连的控件传递给订阅者。

    - (RACSignal<__kindof UIControl *> *)rac_signalForControlEvents:(UIControlEvents)controlEvents;
    
  5. UIControl (RACSignalSupportPrivate)

    在 RACSignalSupportPrivate 分类中,提供了一个根据事件读取控件属性值的信号流,并且还可以通过发送信号量改变指定属性的值。

    - (RACChannelTerminal *)rac_channelForControlEvents:(UIControlEvents)controlEvents key:(NSString *)key nilValue:(nullable id)nilValue;
    

    当指定的事件触发后,该控件指定的属性 key 的值便会通过该方法返回的信号流 RACChannelTerminal 实例对象进行传递,而主动调用该流的 sendNext: 方法时,可以设置 key 所对应的属性值。如果提供的参数值为 nil ,则会设置属性为 nilValue 的值,而 nilValue 本身也可以是 nil 。

    利用该方法进而扩展了下面的分类:

    • UIDatePicker (RACSignalSupport)

      下面的方法,返回一个 RACChannelTerminal 实例,这样便可以获得 UIDatePicker 的属性 date 的变化值,另外,对其值的修改也十分方便。

      - (RACChannelTerminal *)rac_newDateChannelWithNilValue:(NSDate *)nilValue {
      	return [self rac_channelForControlEvents:UIControlEventValueChanged key:@keypath(self.date) nilValue:nilValue];
      }
      
    • UISegmentedControl (RACSignalSupport)

      该分类同 UIDatePicker (RACSignalSupport) 分类类似,返回的信号流传递的是选中部分的索引,主动传递信号量时,是对 UISegmentedControl 控件选中部分的设置。

      - (RACChannelTerminal *)rac_newSelectedSegmentIndexChannelWithNilValue:(NSNumber *)nilValue {
      	return [self rac_channelForControlEvents:UIControlEventValueChanged key:@keypath(self.selectedSegmentIndex) nilValue:nilValue];
      }
      
    • UISlider (RACSignalSupport)

      - (RACChannelTerminal *)rac_newValueChannelWithNilValue:(NSNumber *)nilValue {
      	return [self rac_channelForControlEvents:UIControlEventValueChanged key:@keypath(self.value) nilValue:nilValue];
      }
      
    • UIStepper (RACSignalSupport)

      - (RACChannelTerminal *)rac_newValueChannelWithNilValue:(NSNumber *)nilValue {
      	return [self rac_channelForControlEvents:UIControlEventValueChanged key:@keypath(self.value) nilValue:nilValue];
      }
      
    • UISwitch (RACSignalSupport)

      - (RACChannelTerminal *)rac_newOnChannel {
      	return [self rac_channelForControlEvents:UIControlEventValueChanged key:@keypath(self.on) nilValue:@NO];
      }
      
  6. UIGestureRecognizer (RACSignalSupport)

    该方法返回一个信号流,当当前手势被触发后,信号流便会将该手势传递给订阅者。

    - (RACSignal<__kindof UIGestureRecognizer *> *)rac_gestureSignal;
    
  7. UIImagePickerController (RACSignalSupport)

    @property (nonatomic, strong, readonly) RACDelegateProxy *rac_delegateProxy;
    
    - (RACSignal<NSDictionary *> *)rac_imageSelectedSignal;
    

    调用 rac_imageSelectedSignal 方法,获取一个信号流,其会传递被选中的图片信息。

  8. UITextField (RACSignalSupport)

    该分类中 rac_textSignal 方法返回的信号流,每当控件的任意事件被触发后,都会将控件的文本发送给订阅者。

    方法 rac_newTextChannel 返回的信号流,不仅会传递控件的文本,还可以设置控件的文本。

    - (RACSignal<NSString *> *)rac_textSignal;
    
    - (RACChannelTerminal<NSString *> *)rac_newTextChannel;
    
  9. UITextView (RACSignalSupport)

    当订阅 rac_textSignal 方法返回的信号流时,当前控件的文本会发送给订阅者,而后,每当文本发生变动时,都会向订阅者发送变动的文本。

    @property (nonatomic, strong, readonly) RACDelegateProxy *rac_delegateProxy;
    
    - (RACSignal<NSString *> *)rac_textSignal;
    
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值