错误的代码
当我们使用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;
}
网友评论