wafflestudio / seminar-2021

2021 Rookies 세미나
47 stars 110 forks source link

Collectionview의 datasource를 clear하는 방법 #617

Closed chaemin2001 closed 2 years ago

chaemin2001 commented 2 years ago

새로운 data로 collectionview를 채워야할 때, 기존 datasource를 삭제하는 방법이 궁금합니다.

self.collectionView.dataSource = nil

으로 코드를 짰더니, 새로운 data를 불러오는 과정에서 crash하게 됩니다. 검색을 해보니, 많은 분들이 수동으로 data를 []와 같이 비어있도록 만드셨던데, 이 방법은 다소 현재 model과는 맞지 않은 것 같아 질문 드립니다ㅠㅠ

Ethan-MoBeau commented 2 years ago

음 아마 버튼 눌러서 다른 데이터를 받아와야하는 스펙때문에 고민을 하시는 것 같은데요

제 경우에는 collectionView를 비우고 다시 불러오기 보다는 collectionView를 두개 만들어서 버튼 선택에 따라 다른 collectionView가 화면에 보이도록 구성했습니다 (UITabbarController와 UISegmentControl의 특징을 응용한 방법)

만약 정 생각이 안 나시면 data를 []로 초기화하시는게 가장 쉬운 방법인 것은 맞으니 일단 그렇게 구현하셔도 됩니다 (스펙 상 문제될 것은 없으니... 좋은 구조는 아니지만요)

chaemin2001 commented 2 years ago

SegmentControl을 활용하니 해결되었습니다 감사합니다!!

chaemin2001 commented 2 years ago

음 아마 버튼 눌러서 다른 데이터를 받아와야하는 스펙때문에 고민을 하시는 것 같은데요

제 경우에는 collectionView를 비우고 다시 불러오기 보다는 collectionView를 두개 만들어서 버튼 선택에 따라 다른 collectionView가 화면에 보이도록 구성했습니다 (UITabbarController와 UISegmentControl의 특징을 응용한 방법)

만약 정 생각이 안 나시면 data를 []로 초기화하시는게 가장 쉬운 방법인 것은 맞으니 일단 그렇게 구현하셔도 됩니다 (스펙 상 문제될 것은 없으니... 좋은 구조는 아니지만요)

그런데 infinite scroll을 구현하는 부분에서도 비슷한 문제가 발생합니다ㅠㅠ bindCollectionPopularData()에서 데이터를 받아오고, collection view와 bind하는 작업을 수행했는데, 이 과정에서 다음 페이지 데이터를 기존 array에 append 후 bind를 하고자 하면 기존의 delegate와 datasource가 존재한다는 이유로 crash하게 됩니다. Rxswift에서 infinite scroll을 구현할 때는 작업을 어떻게 나누어야 하는지, 혹은 더 나은 방법이 있는지 궁금합니다.

func scrollViewDidScroll(_ scrollView: UIScrollView) {
    if collectionView.contentOffset.y > (collectionView.contentSize.height - collectionView.bounds.size.height) {
        if !fetchingMore {
            beginFetch()
        }
    }
}

private func beginFetch() {
    fetchingMore = true
    num += 1
    bindCollectionPopularData()
}
Ethan-MoBeau commented 2 years ago

아하 저거는 매번 fetch 할때마다 새로 바인딩을 해줘서 생기는 문젠데요 데이터를 바인딩하실때 observable을 계속 새로 생성하는 것이 아니라 뷰나 뷰모델이 BehaviorSubject를 들고 있고 걔를 최초로 바인딩해준후 그 subject에 기존 데이터 + fetch 된 데이터를 밀어넣어주면 됩니다 즉 바인딩은 1번이고 이벤트만 계속 새로 넣어준다는 뜻인데, 이건 Subject나 Relay에 대해 검색해보시면 이해가 좀 되실겁니다

요것 같은 경우는 swift pagination 으로 검색하시면 정보가 더 나올거에요

chaemin2001 commented 2 years ago

덕분에 해결했습니다! 감사합니다ㅠㅠ