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];
}];