ReactObjc常用
常用信号
//按钮点击事件信号
RACSignal *controlUpdate = [myButton rac_signalForControlEvents:UIControlEventTouchUpInside];
//监测textField改变信号
RACSignal *textChange = [myTextField rac_textSignal];
//alertView UIActionSheet UIImagePickerControl 监测信号
//例如对alertView UIActionSheet 等监测返回的就是点击的按钮index
RACSignal *alertButtonClicked = [myAlertView rac_buttonClickedSignal];
//监测对象某个事件的执行
RACSignal *viewAppeared = [self rac_signalForSelector:@selector(viewDidAppear:)];
UI控件展示与对象属性的绑定
//将label内容与model属性绑定 之后当model属性改变即会改变label内容,
//RACObserve 是采用了KVO方式,因此改变userFullName属性方法需要出发setter方法
RAC(self.userNameLabel, text) = RACObserve(self.viewModel, userFullName);
//当要赋值的属性类型不一致时,可以使用map将属性调整一致
RAC(self.countLabel, text) = [RACObserve(cellVM, count) map:^id _Nullable(NSNumber * _Nullable value) {
return value.stringValue;
}];
//将UI控件内容绑定到对象属性
//将Textfield内容绑定到self.viewModel的userName属性
//rac_textSignal默认检测textEditingEvent 因此代码级别改变Textfield内容不会触发此信号
RAC(self.viewModel, username) = [myTextfield rac_textSignal];
UI事件与对象数据绑定
//订阅数据改变的信号 当数据信号改变时刷新tableView 这样之后我们只需要改变数据即可 无需手动调用tableView刷新事件
//因为这里tableView的刷新绑定两个属性 因此我们需要对这两个信号执行merge
//因为多个信号 同时改变的话可能会导致多次刷新 因此`bufferWithTime`
//设置在指定时间内只执行一次 当设置为0时 在下次屏幕刷新之前(即一个runloop中) 只执行一次 而不会多次刷新
@weakify(self);
[[[RACSignal merge:@[RACObserve(self.viewModel, tweets),
RACObserve(self.viewModel, allTweetsLoaded)]]
bufferWithTime:0 onScheduler:[RACScheduler mainThreadScheduler]]
subscribeNext:^(id value) {
@strongify(self);
[self.tableView reloadData];
}];
//按钮点击事件
[[self.goButton rac_signalForControlEvents:UIControlEventTouchUpInside]
subscribeNext: ^(id value) {
@strongify(self);
[self.viewModel getTweetsForCurrentUsername];
}];