使用ReactiveCocoa中遇到UITableViewCell中的UIButton点击循环引用的问题

错误的代码

当我们使用rac的时候在cell中按钮的事件如下写法的时候,由于UITableView的复用机制,就会发现,会调用很多次

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{
      MLCoolTeamTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];
      [[cell.testBtn rac_signalForControlEvents:UIControlEventTouchUpInside] subscribeNext:^(id x) {
        NSLog(@"click action");
       }];
      return cell;
}

ReactiveCocoa中,RACSignal的subscribeNext的实现是一种订阅者模式,每次注册都会添加一个订阅者信号量[subscribers addObject:subscriber];,一但触发点击事件,所有订阅者的信号量都会被触发,从而触发多次点击事件。

解决--->避免多次注册点击事件

使用rac_command实现点击事件

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    MLCoolTeamTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"cell" forIndexPath:indexPath];
    @weakify(self)
    mcell.testBtn.rac_command = [[RACCommand alloc] initWithSignalBlock:^RACSignal *(id input) {
        @strongify(self)
        NSLog(@"click action");
        return [RACSignal empty];
    }];
    return cell;   
}

你可能感兴趣的:(使用ReactiveCocoa中遇到UITableViewCell中的UIButton点击循环引用的问题)