[Feat] #89 - 보관함 비즈니스 로직 및 셀 바인딩 오류 수정#94
Conversation
…m-iOS into feature/TeamRecorDream#89-StorageBusinessLogic
|
남은 부분 1번에 살짝 코멘트를 달자면, 제가 저번에 은희님한테 CollectionView Cell 분기처리 대신 다른방법 사용하는게 좋을 것 같다고 얘기했었거든요 ! 서버통신 후에 데이터가 비어있으면 아예 CollectionView를 addSubView 하지 않고 EmptyView를 add하는 방식으로 얘기했었는데 어떤가요 ?? 그러면 스크롤도 안되고 더 자연스러울거 같은뎁 ! |
| observer.onNext(entity) | ||
| }, onError: { err in | ||
| observer.onError(err) | ||
| }, onError: { _ in | ||
| observer.onNext(nil) | ||
| observer.onCompleted() |
| } | ||
|
|
||
|
|
||
| override func prepareForReuse() { | ||
| self.genreStackView.arrangedSubviews.forEach { $0.removeFromSuperview() } | ||
| } | ||
|
|
||
| // MARK: - Functions |
There was a problem hiding this comment.
genreStackView 이외에 다른 요소들은 따로 처리 안해줘도 괜찮은가요??!
There was a problem hiding this comment.
레이아웃 부분은 setupConstraint에서 처리해주고 있고, setData에서 바뀌어야 하는 모든 값들을 초기화하고 있어서 괜찮습니다!
|
한가지 궁금한점이 그러면 레이아웃이 바뀔때마다 snapshot도 재적용 되는건가요 ?? |
|
@Suyeon9911 엠티뷰에 대한 의견 제안 감사합니다! 현재 구조로는 emotion 부분이 컬렉션뷰 내부에 존재하고, 이 부분은 레코드가 있든 없든 나타나야 해서 컬렉션뷰를 아예 addsubView하지 않으면 안될 것 같아요..! 레이아웃에 대한 부분은, 정확히 말해서 snapshot이 바뀔 때마다 레이아웃을 다시 그리게 됩니다. 거기에 대해 유추할 수 있는 포인트는 동일한 서로 다른 컬렉션뷰 레이아웃을 할당하는 것이 아니라, 컬렉션뷰 레이아웃을 두고 지역 변수를 통해 분기처리를 한 상황이라는 것입니다. snapshot에 변동이 있을 시 해당 시점에 동일한 레이아웃 객체를 참조하여 레이아웃을 다시 그리는거라고 생각할 수 있죠! 만약 collectionView.collectionViewLayout을 재할당하는 경우를 말씀하신 거라면, 그 부분에 대해서는 snapshot이 바뀌기보다는 이미 존재하는 snapshot으로 새로운 레이아웃을 그렸다고 생각해야겠죠? |
|
A1 : 아하 위의 emotion이 아예 컬렉션뷰 내부에 있는 구조로 되어있군요 !!! 제가 예전에 적용했던 구조랑은 달라서 그부분은 적용이 어려울 것 같네요 !! 확인 했습니다 ~~ A2 : 저는 처음에 레이아웃이 바뀔때마다 snapshot이 바뀌는 줄 알고 비효율적이지 않나 생각했는데, snapshot이 바뀌면 그에 맞는 레이아웃 객체를 참조해서 그려주는 것이군요 !! 이해했습니다 감사합니다 ~~ |
EunHee-Jeong
left a comment
There was a problem hiding this comment.
CompositionalLayout 분기처리 & 보기 형식 전환 시 셀 레이아웃 재적용
→ 이 부분 너무 어려웠는데 깔끔한 해결 감사합니당…
DiffableDatasource에서 스냅샷을 찍는 전후와 모델이 되는 데이터의 변화를 잘 뜯어봐야겠네요…!
한 가지 질문이 있는데 53a0ab4 커밋 내에 달아놓았습니다 !!


👻 작업한 내용
🎤 Fix
🍒 Cherry Pick
이미지 어셋 추가 관련 부분 Cherry Pick 했습니다.
🗳️ Feat
CompositionalLayout 분기처리
처음에는 두 개의 layout을 작성한 다음, 필터 버튼이 눌리면 컬렉션뷰의 레이아웃을 직접 참조해서 할당하려 했습니다.
여기에 추가로 layoutSubviews에서 InvalidateLayout을 통해 할당된 레이아웃을 해제하고 재적용하려 했는데, UI가 많이 부자연스럽게 전환되었습니다.
찾아보니(자료) diffable Data Source를 사용하면 applySnapshot을 하는 시점에서 dataSource가 적용됨과 동시에 collectionViewLayout이 다시 반영된다고 합니다. 따라서 레이아웃은 처음 한 번만 생성하고, VC 내부의 currentLayoutType에 의존하여 내부에서 분기처리하도록 했습니다.
보기 형식 전환 시 셀 레이아웃 재적용
53a0ab4
DiffableDatasource의 경우 UI를 업데이트하기 위해서는 Hashable에 의해 새로운 데이터라고 판단되어야만 applySnapshot 시에 적용됩니다. 따라서 layoutChangeHalder를 entity 내부에 선언했고, reapply시에 toggle하여 적용했습니다.
또한 레이아웃 변동 시에 init 시점이 아니라 dequeReusable에서 이미 생성된 셀을 사용하기 때문에 setConstraints를 외부에서 호출하는 방식으로 수정했습니다.
5c96acb
재사용 시에 레이아웃을 삭제하기 위해 removeFromSuperView를 하는 부분을 추가했습니다.
남은 부분
📸 영상
KakaoTalk_Video_2023-01-04-16-02-12.mp4
📮 관련 이슈