문제 상황
- CollectionView Cell안에 있는 Button 터치 시 다른 ViewContorller로 push되는 상황
- 정상 작동할 때도 있고 한 번 터치 했는데 2번, 3번 push 될 때도 있음
Cell의 재활용
- iOS 에서 이 Cell 들을 사용할때 보여줘야할 Cell 들을 모두 새롭게 생성하는 것이 아니라 화면에 보이는 부분만 생성하고 재활용하는 로직을 수행
- 메모리 효율성을 고려한 것
- 이 때 일반적으로, 셀을 재활용하기전에 초기화해야하는 세팅들을 prepareForReuse() 라는 메서드 안에 코드 작성한다.

RxSwift와 Cell
- 각 Cell에 대한 구독을 했을 때 prepareForReuse()에서 구독을 해제코드를 반드시 작성
- prepareForReuse() 에서 명시적 구독 해제를 해주지 않으면 재활용하게되는 다른 셀에서 재활용된 구독을 하기 때문에 원하지 않는 엉뚱한 값을 받게 된다.
- 셀이 재사용될 때, 이전 구독이 여전히 활성 상태라면, 오래된 데이터 스트림이 새로운 셀에 잘못 전달될 수 있고, 불필요한 메모리 사용이 계속될 수 있습니다.
class PhotoCell: UICollectionViewCell {
// MARK: - Properites
static let identifier = "PhotoCell"
var disposeBag = DisposeBag()
override func prepareForReuse() {
disposeBag = DisposeBag()
}
private func configureCardDataSource() {
cardDatasource = UICollectionViewDiffableDataSource<LikeSection, Like>(collectionView: cardCollectionView, cellProvider: { collectionView, indexPath, item in
guard let cell = collectionView.dequeueReusableCell(withReuseIdentifier: LikeCardCell.identifier, for: indexPath) as? LikeCardCell
else { return UICollectionViewCell() }
cell.xButton.rx.tap
.map { Reactor.Action.didTapXButton }
.bind(to: self.reactor.action)
.disposed(by: cell.disposeBag)
cell.updateCell(item: item)
return cell
})
참고 자료
[iOS] RxSwift 와 UI Cell 을 함께 사용할때 생각할 것들