ViewController에는 하나의 collectionView가 있고, 그 cell 안의 버튼을 눌렀을 때 좋아요를 취소하는 로직을 구성하고 있었다.
좋아요한 아이템은 Realm으로 관리하고 있었으며, ViewModel로 로직을 완벽하기 분리하고 싶어서 ViewController는 `import Realm`을 하고싶지 않았다.
그렇다면 cell안의 로직을 어떻게 구성해야 할까?
cell안의 로직은 ViewController에서 작성돼야 하며, Realm괴 관련된 로직은 ViewModel에서만 다루고 싶다.
결국 다음과 같은 상황인 것이다.
옵저버블을 만들어서 넘길수도 있겠고, cell의 ViewModel을 별도로 만든다거나, drive 안에서 RealmDB를 fetch해서 처리할수도 있겠다.
단, 세 번째 방법같은 경우에는 결국엔 ViewController에 `import Realm`을 해야 한다는 단점이 있었다.
대신 이번에는 클로저를 통해서 값전달을 하는 방식으로 해보았다.
클로저를 통해 ViewModel로 값전달하기
cell 안의 버튼을 탭할때의 로직이 필요할 때, viewModel로 넘기기 애매한 부분이 있다.
다음과 같이 클로저를 활용해서 넘겨보자!
- ViewModel에서 클로저 타입의 변수 생성
final class LikeItemViewModel {
var likeButtonTapped: ((Int) -> Void)?
//...
- ViewController에서 로직이 필요한 시점에 ViewModel에 접근해서 해당 클로저 실행
output.likeItemList
.drive(likeItemView.shoppingCollectionView.rx.items(cellIdentifier: ShoppingCollectionViewCell.id, cellType: ShoppingCollectionViewCell.self)) { item, element, cell in
cell.configureRealmData(data: element)
cell.likeButton.rx.tap
.asDriver()
.drive(with: self) { owner, _ in
// 이 시점에 실행되게 하고싶어!
owner.viewModel.likeButtonTapped?(item)
owner.likeItemView.shoppingCollectionView.reloadData()
// ...
}
// ...
}
// ...
}
- ViewModel에서 클로저 로직 작성
likeButtonTapped = { [weak self] index in
let data = self?.repository.fetchAll()
let deleteData = data?[index]
self?.repository.deleteItem(data: deleteData ?? LikeItem(imageURL: "", mallName: "", titleName: "", price: ""))
self?.likeItemList.accept(data!)
likeListCount.accept(data?.count ?? 0)
print(index)
}
이렇게 하면 ViewController에 Realm을 import하지 않고도 아이템을 삭제하는 로직을 구현할 수 있다!
간단한 아이디어일수 있으나, Input Output 구조를 너무 습관적으로 쓰려다보니 쉽게 떠오르지 않았었다.
클로저를 활용한 방법 외에도 다른 방법도 시도해볼 예정이다.
'iOS > UIKit' 카테고리의 다른 글
[iOS/UIKit] 멀티섹션, 멀티모델로 RxDataSource + Compositional Layout 구성하기 (0) | 2025.03.09 |
---|---|
[iOS/UIKit] Realm을 DiffableDataSource와 함께 사용할때 발생할 수 있는 오류 (0) | 2025.03.03 |
[iOS/UIKit] Diffable DataSource를 이용해 서로 다른 Cell로 구성하기 - Xcode16에서 발생할 수 있는 오류 (0) | 2025.02.28 |
[iOS/UIKit] debounce VS throttle (0) | 2025.02.26 |
[iOS/UIKit] RxSwift에서의 Cell의 중첩 구독 문제 (0) | 2025.02.23 |