跳转至

takeUntil

给takeUntil传的是哪个信号,那么当这个信号发送信号或sendCompleted,就不能再接受源信号的内容了。

takeUntil需要一个信号作为标记,当标记的信号发送数据,就停止。

(void)takeUntil {
    RACSubject *subject = [RACSubject subject];
    RACSubject *subject2 = [RACSubject subject];
    [[subject takeUntil:subject2] subscribeNext:^(id x) {
        NSLog(@"%@", x);
    }];
    // 发送信号
    [subject sendNext:@1];
    [subject sendNext:@2];
    [subject2 sendNext:@3];  // 1
    //    [subject2 sendCompleted]; // 或2
    [subject sendNext:@4];
}

Cell复用时的问题

解决复用cell中信号的办法就是在cell里面创建的信号加上takeUntil:cell.rac_prepareForReuseSignal来让cell在每次重用的时候都去 disposable创建的信号(解绑信号)

- (UITableViewCell *)tableView:(nonnull UITableView *)tableView cellForRowAtIndexPath:(nonnull NSIndexPath *)indexPath {
    UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"TableViewCell"];

    @weakify(self);
    [[RACObserve(cell.textLabel, text) takeUntil:cell.rac_prepareForReuseSignal] subscribeNext:^(id x) {
        @strongify(self);
        NSLog(@"%@", self);
    }];


    [[cell.tfV.rac_textSignal takeUntil:cell.rac_prepareForReuseSignal] subscribeNext:^(NSString * _Nullable x) {
      NSLog(@"cusLevelsPrice:%@",x);
      @strongify(self)
        self.customerLevelVM.cusLevels[indexPath.row].LevelPrice = x;
    }];


    return cell;
}