프로젝트를 진행하던 도중 다음의 화면을 구현해야 했다. 처음에 든 생각은 Compositional Layout으로 두 개의 섹션으로 구성하면 될 것 같았다.그런데 현재 RxSwift로 구성해놓은 상태여서 다중 섹션을 쓰려면 RxDataSource를 사용했어야 했다.또한 두 개의 섹션에 들어가는 셀과 모델이 서로 다르기도 했다. 이번 글에서는 멀티섹션 멀티모델로 RxDataSource와 Compositional Layout을 구현하는 방법에 대해 알아보겠다.ViewModel에서 RxDataSource를 위한 Section과 Data 세팅먼저 ViewModel에서 두 개의 섹션을 구성하고, 그 안에 들어갈 모델들을 설정해주었다. 첫 번째 섹션에는 `MockTrendingCoinItem`이라는 모델이, 두 ..
ViewController에는 하나의 collectionView가 있고, 그 cell 안의 버튼을 눌렀을 때 좋아요를 취소하는 로직을 구성하고 있었다.좋아요한 아이템은 Realm으로 관리하고 있었으며, ViewModel로 로직을 완벽하기 분리하고 싶어서 ViewController는 `import Realm`을 하고싶지 않았다. 그렇다면 cell안의 로직을 어떻게 구성해야 할까?cell안의 로직은 ViewController에서 작성돼야 하며, Realm괴 관련된 로직은 ViewModel에서만 다루고 싶다.결국 다음과 같은 상황인 것이다. 옵저버블을 만들어서 넘길수도 있겠고, cell의 ViewModel을 별도로 만든다거나, drive 안에서 RealmDB를 fetch해서 처리할수도 있겠다.단, 세 번째 방..
Realm을 통해 DB를 관리하는 프로젝트에서 DiffableDataSource를 이용해 CollectionView를 구성하고 있었다. 원하는 상품을 위시리스트에 담고, 그 리스트를 보여주는 화면이었으며,각 Cell을 탭하면 위시리스트에서 제거되는 로직을 구성하는 중이었다. 그런데, Realm에 있는 데이터를 불러오고 데이터를 추가하는데는 문제가 없었으나, Cell을 탭하는 동작, 즉 삭제하는 과정에서 다음과 같은 런타임 에러가 발생했다. Object has been deleted or invalidated 이 오류는 Realm에서는 데이터가 삭제됐는데, view에서는 삭제되지 않은 상태로 남아있을 때 발생하는 오류였다.그런데, 뷰를 업데이트하는 로직도 문제 없었고, Realm의 DB 자체에도 문제는 없..
Compositional Layout과 Diffable DataSource를 학습하면서하나의 CollectionView를 서로 다른 CustomCell 2개를 이용해서 구성하고 싶어졌다. 그런데, 예상치 못한 런타임 에러가 나면서 앱이 강제종료됐다.Thread 1: "Expected dequeued view to be returned to the collection view in preparation for display. When the collection view's data source is asked to provide a view for a given index path, ensure that a single view is dequeued and returned to the collection ..
RxSwift에서 비슷한 역할을 하는 오퍼레이터들이 있다. 그 중에서 debounce와 throttle의 차이에 대해 알아보도록 하겠다.debouncedebounce와 throttle 둘 다 특정한 시간 텀을 두고 같은 동작이 일어나지 않게 하는 오퍼레이터라고 보면 된다. 둘의 차이를 보기 위해 둘다 버튼을 탭하는 동작에 적용을 해놓은 상태이다.버튼을 누르면 count가 +=1 되고, 그 숫자가 Label에 반영이 되는 형태이다. 그 중에 먼저 debounce의 코드는 다음과 같다.debounceButton.rx.tap .debounce(.seconds(2), scheduler: MainScheduler.instance) .bind(with: self) { owner, _ in o..
RxSwift를 통해 TableView를 구성하고, 그 TableView Cell안에 있는 버튼을 탭했을때의 동작을 구현하고 있었는데,다음과 같은 문제가 발생했다. TableView를 스크롤을 한 이후에 '받기'라는 Cell안의 버튼을 누르면 push가 계속 되는 현상이 발생했다...! 이번 글에서는 이러한 현상이 발생하는 이유와 해결법에 대해 알아보겠다.Cell의 중첩 구독 문제코드는 다음과 같다.items .bind(to: tableView.rx.items(cellIdentifier: SearchTableViewCell.identifier, cellType: SearchTableViewCell.self)) { (row, element, cell) in cell.appNameLabel..