본문 바로가기

TIL

[TIL] RxSwift, TableView Cell에서 Tap 이벤트 발생 시 반드시 고려해야할 점

 

iOS 에서의 UI Cell 재활용

iOS에서는 UITableViewCell과 UICollectionViewCell을 사용할 때, 보여줘야할 Cell들을 모두 새롭게 생성하는 것이 아니라 화면에 보이는 부분만 생성하고 재활용하는 로직을 수행한다.(메모리 효율성 고려)

 

 

이때 일반적으로 Cell이 재활용되기 전에 초기화해야하는 설정들은 prepareForReuse() 메서드에서 처리해준다.

RxSwift와 함께 사용되는 Cell

RxSwift와 Cell을 함께 사용하는 경우, Cell이 재활용되는 시점 전에 구독(Subscribe)를 끊지 않으면 재활용시 구독이 그대로 남아있게 되어 예기치 못한 동작을 일으킬 수도 있다.

 

아래 예시를 들어보자 

 

아래 예시는 Cell 내부의 어떤 버튼을 탭했을 때 다른 VC로 이동하는 이벤트를 발생하는 스트림(Stream)을 구성한 코드이다.

 

위 상황에서 테이블 뷰를 위 아래로 사정없이 스크롤한 후, 버튼을 탭해보면 아래 영상과 같이 다수의 VC가 한꺼번에 push되는 현상을 확인할 수 있다.

해결법

해결법은 의외로 간단하다. 위에서도 언급햇듯이 단순히 Cell이 재활용되기 전 prepareForReuse() 매서드에서 Cell에 대한 구독을 초기화(dispose) 시켜주면 된다.

var disposeBag = DisposeBag()

//..

override func prepareForReuse() {
    super.prepareForReuse()

    // 셀 재사용 초기화
    disposeBag = DisposeBag()
}

 

참고자료

https://velog.io/@s_sub/%EC%83%88%EC%8B%B9-iOS-16%EC%A3%BC%EC%B0%A8RxSwift-Dispose

https://sueaty.tistory.com/158

'TIL' 카테고리의 다른 글

[TIL] Single에 대한 간단 내용 정리  (0) 2024.04.08
[TIL] 스트림 공유  (1) 2024.04.05
[TIL] RxSwift 간단 요약 정리  (0) 2024.04.03
[TIL] ATS에 대하여  (6) 2024.03.27
[TIL]TableView Cell로 아코디언 형식 만들기  (3) 2024.03.15