美文网首页
RAC用于UITableViewCell复用时的问题

RAC用于UITableViewCell复用时的问题

作者: MccReeee | 来源:发表于2017-09-09 16:10 被阅读1197次

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

    具体看代码:

    - (NSInteger)tableView:(nonnull UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
        return 1000;
    }
    
    - (UITableViewCell *)tableView:(nonnull UITableView *)tableView cellForRowAtIndexPath:(nonnull NSIndexPath *)indexPath {
        UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:@"TableViewCell"];
    
        @weakify(self);
        [RACObserve(cell.textLabel, text) subscribeNext:^(id x) {
            @strongify(self);
            NSLog(@"%@", self);
        }];
    
        return cell;
    }
    

    我们看到这里的RACObserve创建的Signal和self之间已经去掉了循环引用的问题,所以应该是没有什么问题的。但是结合之前我们对RACObserve的理解再仔细分析一下,这里的Signal只要self没有被dealloc的话就不会被释放。虽然每次UITableViewCell都会被重用,但是每次重用过程中创建的信号确实无法被disposable。那我们该怎么做呢?

    - (NSInteger)tableView:(nonnull UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
        return 1000;
    }
    
    - (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);
        }];
    
        return cell;
    }
    

    注意,我们在cell里面创建的信号加上takeUntil:cell.rac_prepareForReuseSignal,这个是让cell在每次重用的时候都去disposable创建的信号。

    相关文章

      网友评论

          本文标题:RAC用于UITableViewCell复用时的问题

          本文链接:https://www.haomeiwen.com/subject/mufajxtx.html