[iOS] Delegate, DataSource의 차이점, 그런데 이제 RxSwift를 곁들인..

Madeline👩🏻‍💻·2024년 4월 28일
1

iOS study

목록 보기
48/61

🥔
오늘도 열심히 공부 하고 있는 매들린입니다.
매번 습관처럼 선언하던 UITableView와 UICollectionView의
delegate, datasouce = self 처리와 프로토콜 채택.
어느 순간 저에겐 뭔지도 모르고 일단 코드부터 작성하는 머슬 메모리 중 하나가 되었는데요,

뭔지 몰라도 잘 쓰고 있었던건, 아무런 문제가 없었습니다. 뭔지 몰라도 흐린 눈 처리하고 살아왔습니다. (이제 RxSwift를 만나기 전까지는..)
RxSwift로 CollectionView를 구현하던 도중, 너무 당연히 동작해야 하는 item selected와 같은 기능이나, item의 size, section height 같은 기본 기능들이 동작을 하지 않는 이슈를 만나게 되었고,
이제는 더이상 물러날 수 없다는 마음으로 정리 시작합니다.

UICollectionView의 Delegate와 DataSource의 차이점

Delegate

UICollectionViewDelegate는 사용자 상호작용에 응답하는 메소드를 제공합니다.
예를 들어, 사용자가 특정 셀을 선택했을 때의 동작을 정의하거나 셀의 선택 해제를 감지할 수 있습니다.
또한, UICollectionViewDelegateFlowLayout는 셀의 크기, 섹션 간 간격 및 셀 간의 여백 등 레이아웃과 관련된 세부 조정을 가능하게 합니다.

DataSource

UICollectionViewDataSource는 컬렉션 뷰의 데이터 모델을 관리합니다. 데이터 모델의 항목 수를 알려주고, 각 셀에 대한 정보를 제공하며, 필요한 셀을 컬렉션 뷰에 제공하는 역할을 합니다.
주로 collectionView(:numberOfItemsInSection:)과 collectionView(:cellForItemAt:) 메소드를 통해 이를 구현합니다.

RxSwift에서의 UICollectionView 구현

RxSwift를 사용하여 UICollectionView를 구현할 때, 기존의 delegate와 dataSource 설정을 Rx 방식으로 바꿀 수 있습니다. RxSwift 확장은 이벤트를 Observables로 변환하여, UIKit과 Rx의 세계를 연결합니다.

Proxy란 무엇인가?
Proxy는 "대리인" 또는 "중개자"를 의미합니다. 소프트웨어 개발에서는 특정 객체의 기능을 대신하거나 중개하는 역할을 수행하는 객체를 가리키는 데 사용됩니다. Proxy 객체는 원래 객체로의 접근을 제어하거나, 추가적인 기능을 제공하거나, 요청을 전달하는 등의 역할을 할 수 있습니다.
RxSwift에서의 Proxy 사용은 UIKit의 컴포넌트RxSwift 사이에서 이벤트 처리를 중개하는 역할을 합니다. 이는 RxSwift가 UIKit의 이벤트를 Observable로 변환하여, RxSwift의 리액티브 프로그래밍 패턴에 맞게 사용할 수 있도록 돕습니다.

Rx Delegates

RxSwift에서는 rx.setDelegate(self)를 사용하여 Rx 이외의 delegate 메소드를 처리할 수 있습니다.
이 메소드를 호출하면 Rx가 제공하는 delegate proxy를 사용하여, 일반 delegate 메소드를 Rx의 구독(subscription) 메커니즘을 통해 관리할 수 있게 됩니다.
이는 UICollectionView의 선택 이벤트나 스크롤 이벤트 같은 사용자의 인터랙션을 Rx 이벤트로 변환할 수 있게 합니다.

Rx DataSources

RxDataSources는 복잡한 데이터 변화를 감지하고 자동으로 적절한 애니메이션과 함께 UI를 업데이트하는 라이브러리입니다. UICollectionView의 데이터 바인딩을 위해 Observable 시퀀스를 데이터 소스에 직접 바인딩 할 수 있으며, 섹션 모델을 사용하여 다양한 구성의 섹션을 쉽게 관리할 수 있습니다.
예를 들어, collectionView.rx.items(cellIdentifier:cellType:) 메소드를 사용하여 Observable 배열과 컬렉션 뷰를 연결할 수 있습니다.

👩🏻‍🚒 트러블슈팅

저는 mainView.collectionView.rx.setDataSource(self)를 추가하지 않아서, 셀을 선택하는 로직이 동작하지 않았었는데요, 그 이유는 RxSwift의 내부 구현에 있습니다.
RxSwift는 UIKit의 컴포넌트에 대해 proxy를 제공하고, 이 proxy는 UIKit의 delegate/datasource와 RxSwift의 Observable 사이에서 중개자 역할을 합니다. (UIKit의 delegate와 dataSource 설정을 대신하여, 컬렉션 뷰의 이벤트를 RxSwift의 Observable 스트림으로 전달)
setDataSource를 호출하면 RxSwift는 이 dataSource를 설정하고 관리하게 됩니다.

일반적으로 RxSwift를 사용할 때 itemSelected 같은 이벤트는 collectionView.rx.itemSelected를 통해 직접 Observable로 제공됩니다.
그러나 rx.setDataSource(self)를 사용함으로써 Rx의 dataSource proxy가 활성화되고, 이는 데이터 소스 관련 변경(예를 들어 데이터 업데이트)이 발생할 때 컬렉션 뷰에 알릴 수 있습니다.
또한, 이를 통해 데이터 바인딩과 사용자 인터랙션을 더 세밀하게 제어할 수 있으며, 컬렉션 뷰의 업데이트가 보다 정확하게 처리되도록 합니다.

애증의 RxSwift

RxSwift로 CollectionView를 구현할 때의 장점은 뭐 반응형 프로그래밍이니, 데이터 흐름이나 이벤트 처리가 용이하겠지만, 단점은 익히기 어렵다!!!!!!! 저같은 사람에겐 아직도 낯설고 어렵단 말입니다.
하지만 수동으로 UI를 업데이트하지 않아도 되고, 에러 처리하기도 스트림을 통해 일관성있게 수행할 수 있기 때문에, 좋은 UX를 위해서도 꼭 필요하겠다는 생각을 하며,
포스트를 마칩니다,,

profile
🍎 Apple Developer Academy@POSTECH 2기, 🍀 SeSAC iOS 4기

0개의 댓글