iOS-解决使用ReactiveCocoa时,点击Cell上Button了连续触发事件和发送通知、通知多次执行的问题

问题一:使用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) {
        }];

你可能感兴趣的:(iOS-解决使用ReactiveCocoa时,点击Cell上Button了连续触发事件和发送通知、通知多次执行的问题)