问题一:使用RAC时点击Cell上Button了连续触发事件
解决方法:添加takeUntil:cell.rac_prepareForReuseSignal
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
NSString *cellID = @"DSTestTableViewCell";
DSTestTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellID];
if (!cell) {
cell = [[DSTestTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellID];
}
[[[cell.btn rac_signalForControlEvents:UIControlEventTouchUpInside] takeUntil:cell.rac_prepareForReuseSignal] subscribeNext:^(id x) {
NSLog(@"click action");
}];
return cell;
}
原因分析:
首先这是由cell的复用机制导致的,我们知道cell在移出屏幕时并没有被销毁,而是到了一个重用池中,放到池子前我们已经做了
[[cell.btn rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) {}];
如果在复用池取不到的话就会再创建。所以接下来出现在屏幕内的cell极有可能是池子里的,取出来之后再进行上述的rac_signalForControlEvents操作,导致每rac_signalForControlEvents多少次操,点击按钮时,事件就被触发多少次!
此时就得通过takeUntil:someSignal来终止cell.btn之前的signal了:
takeUntil:someSignal 的作用是当someSignal sendNext时,之前的signal就sendCompleted
问题二:使用RAC时发送通知、通知无法被销毁、通知多次执行
解决方法:添加takeUntil:self.rac_willDeallocSignal
[[[[NSNotificationCenter defaultCenter] rac_addObserverForName:XQPDidUpLoadHeaderImageViewNotification object:nil] takeUntil:self.rac_willDeallocSignal] subscribeNext:^(id x) {
}];