RACSignalSupport
RACSignalSupport 是 ReactiveCocoa 框架中为 CocoaTouch 框架中的一些类声明的扩展类,其旨在为这些类添加信号流的特性。
-
视图的重用
- 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 获取全局对象。
-
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
将不会传递按钮索引。 -
UIAlertView (RACSignalSupport)
@property (nonatomic, strong, readonly) RACDelegateProxy *rac_delegateProxy; - (RACSignal<NSNumber *> *)rac_buttonClickedSignal; - (RACSignal<NSNumber *> *)rac_willDismissSignal;
该分类同 UIActionSheet (RACSignalSupport) 类似,
rac_buttonClickedSignal
会传递点击的按钮的索引,而rac_willDismissSignal
会传递使视图消失的按钮的索引。 -
UIControl (RACSignalSupport)
使用
rac_signalForControlEvents
方法,可以获取一个信号流,当控件指定的事件触发时,该信号流便会将与该事件相关连的控件传递给订阅者。- (RACSignal<__kindof UIControl *> *)rac_signalForControlEvents:(UIControlEvents)controlEvents;
-
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]; }
-
-
UIGestureRecognizer (RACSignalSupport)
该方法返回一个信号流,当当前手势被触发后,信号流便会将该手势传递给订阅者。
- (RACSignal<__kindof UIGestureRecognizer *> *)rac_gestureSignal;
-
UIImagePickerController (RACSignalSupport)
@property (nonatomic, strong, readonly) RACDelegateProxy *rac_delegateProxy; - (RACSignal<NSDictionary *> *)rac_imageSelectedSignal;
调用
rac_imageSelectedSignal
方法,获取一个信号流,其会传递被选中的图片信息。 -
UITextField (RACSignalSupport)
该分类中
rac_textSignal
方法返回的信号流,每当控件的任意事件被触发后,都会将控件的文本发送给订阅者。方法
rac_newTextChannel
返回的信号流,不仅会传递控件的文本,还可以设置控件的文本。- (RACSignal<NSString *> *)rac_textSignal; - (RACChannelTerminal<NSString *> *)rac_newTextChannel;
-
UITextView (RACSignalSupport)
当订阅
rac_textSignal
方法返回的信号流时,当前控件的文本会发送给订阅者,而后,每当文本发生变动时,都会向订阅者发送变动的文本。@property (nonatomic, strong, readonly) RACDelegateProxy *rac_delegateProxy; - (RACSignal<NSString *> *)rac_textSignal;