Skip to content

[RxSwift] Cell에 ViewModel을 할당하여 바인딩 처리할 때 주의해야할 점

Ari edited this page Jul 24, 2022 · 1 revision

각 Cell 마다 체크버튼, 혹은 Like 버튼, home 버튼을 눌러 상태 변화를 하며, 데이터를 변경 시키고 그에 맞게 버튼의 이미지를 변경해주는 작업을 진행하는 상황이였다. 그러나 버튼을 누를 때 마다 버튼이 제대로 동작하지 않을 뿐만 아니라, 다른 인덱스에 존재하는 셀의 버튼의 상태도 함께 바뀌는 것이 문제였다.

추측 왠지 바인딩 처리한 것이 끊기지 않고 계속 연결되어 있어서 버튼을 터치할 때 마다 다른 셀의 버튼들도 같이 반응하는 것이 아닌가? 라는 생각이 들었다.

구글링을 해보니 구독해둔 부분이 취소되지 않고 유지되면서 생기는 문제를 겪은 블로그 글을 찾게 되었다.

  • Cell은 화면밖에서 사라진다고 deinit이 되는 것이 아니라 재사용을 한다.
  • 그렇기 때문에 기존에 바인딩 처리를 해두었던 것이 취소되지 않고 유지되면서 발생하는 문제였다.

해결 따라서 셀을 재사용하기 이전에 prepareForReuse 메소드를 활용하여 disposeBag을 새로운 DisposeBag을 재할당 해줌으로써 해당 문제를 해결할 수 있게 되었다.

class VillagersCell: UICollectionViewCell {
    
    private var viewModel: VillagersCellViewModel!
    private var disposeBag = DisposeBag()
    
    ...
    
    override func prepareForReuse() {
        super.prepareForReuse()
        likeButton.setImage(nil, for: .normal)
        houseButton.setImage(nil, for: .normal)
        viewModel = nil
        disposeBag = DisposeBag() // disposeBag을 새걸로 갈아끼워준다.
    }
    
    ...

}

Clone this wiki locally