-
Notifications
You must be signed in to change notification settings - Fork 1
[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을 새걸로 갈아끼워준다.
}
...
}
- [성능] 필터링 걸고 아이템을 체크했을 때 앱의 반응속도가 느려지는 현상
- [RxSwift] Cell에 ViewModel을 할당하여 바인딩 처리할 때 주의해야할 점
- [ARC] dismiss 혹은 popViewController 호출 이후에도 메모리 할당이 해제되지 않는 이유?
- [UIKit] CollectionView의 높이를 콘텐츠 높이에 따라 동적으로 레이아웃 설정하는 법
- [UIKit] UICollectionView의 Cell Dynamic Size 지정해주기
- [UIKit] Navagation title을 줄바꿈 할 수는 없을까?
- [UIKit] Progress Bar의 높이를 변경하는 방법
- [UIKit] 왜 네비게이션 타이틀이 Large가 아닌 small로 나오는 걸까?
- [Xcode] LaunchScreen.storyboard에 배경색을 커스텀색상을 사용했는데, 다크모드가 작동하지 않는 현상
- [Xcode] 실제 디바이스로 앱을 테스트 하던 도중 발생한 문제