본문 바로가기

Project/MovieClip

🤔 reloadData() 함수의 역할 및 동작 방식

✅ reloadData() 함수의 역할 및 동작 방식

이 함수가 실행되면 UICollectionViewDiffableDataSource를 업데이트하여 최신 검색 결과를 UI에 표시

 

🔹 1. reloadData() 함수의 전체적인 흐름

private func reloadData() {

    // 📌 새로운 snapshot을 생성하여 기존 데이터를 리셋
    var snapshot = NSDiffableDataSourceSnapshot<SearchSection, SearchItem>()
    
   
    if !viewModel.movies.isEmpty {
    
        // 📌 movies 데이터가 있다면 .movie 섹션을 추가 (tvShows, people 동일)
        snapshot.appendSections([.movie])
        
        // 📌 movies 데이터를 SearchItem.movie로 변환 후 .movie 섹션에 추가
        snapshot.appendItems(viewModel.movies.map { SearchItem.movie($0) }, toSection: .movie)
    }
    
    if !viewModel.tvShows.isEmpty {
        snapshot.appendSections([.tv])
        snapshot.appendItems(viewModel.tvShows.map { SearchItem.tv($0) }, toSection: .tv)
    }
    
    if !viewModel.people.isEmpty {
        snapshot.appendSections([.people])
        snapshot.appendItems(viewModel.people.map { SearchItem.people($0) }, toSection: .people)
    }
    
    // 📌 snapshot을 적용하여 검색 결과 UI를 업데이트
    dataSource?.apply(snapshot, animatingDifferences: true)
}

 

🔹 3. reloadData() 함수가 실행되는 시점

🔥 reloadData()는 언제 실행될까?

  • 사용자가 검색어를 입력할 때 → viewModel.search(query:)가 실행된 후 데이터가 변경됨
  • 더보기 버튼을 눌러서 추가 데이터를 불러올 때 → viewModel.loadMore(for:) 실행 후
  • 번역이 완료되었을 때 → translatedOverviews가 변경된 후

 

🔹 4. reloadData() 동작 흐름을 쉽게 이해하는 예제

📌 예제 1️⃣ - 사용자가 Harry를 검색하면?

viewModel.movies = [Movie(id: 1, title: "Harry Potter"), Movie(id: 2, title: "Harry & Meghan")]
viewModel.tvShows = [TV(id: 10, title: "The Secrets of Harry Potter")]
viewModel.people = [Person(id: 100, name: "Daniel Radcliffe")]
reloadData()

 

📌 실행 결과 (Diffable Data Source 스냅샷)

Sections: [movie, tv, people]

Movie Items: 
1. Harry Potter
2. Harry & Meghan

TV Items:
1. The Secrets of Harry Potter

People Items:
1. Daniel Radcliffe
 

📌 예제 2️⃣ - 추가 데이터가 들어오면?

viewModel.movies.append(Movie(id: 3, title: "Harry's Journey"))
reloadData()

 

📌 실행 결과 (Diffable Data Source 스냅샷)

Sections: [movie, tv, people]

Movie Items: 
1. Harry Potter
2. Harry & Meghan
3. Harry's Journey ✅ 새 데이터 추가됨!

TV Items:
1. The Secrets of Harry Potter

People Items:
1. Daniel Radcliffe

 

 

🔷 appendItems부분 map 없이 작성할 경우 

if !viewModel.movies.isEmpty {
    snapshot.appendSections([.movie]) // 🎬 영화 섹션 추가
    
    var movieItems: [SearchItem] = [] // 🎬 영화 아이템 저장할 배열 생성
    
    for movie in viewModel.movies {
        let movieItem = SearchItem.movie(movie) // 🔹 SearchItem의 .movie 케이스로 변환
        movieItems.append(movieItem) // 🔹 변환한 아이템을 배열에 추가
    }
    
    snapshot.appendItems(movieItems, toSection: .movie) // 🎬 변환된 영화 데이터를 해당 섹션에 추가
}


if !viewModel.tvShows.isEmpty {
    snapshot.appendSections([.tv]) // 📺 TV 섹션 추가
    
    var tvItems: [SearchItem] = [] // 📺 TV 아이템 저장할 배열 생성
    
    for tvShow in viewModel.tvShows {
        let tvItem = SearchItem.tv(tvShow) // 🔹 SearchItem의 .tv 케이스로 변환
        tvItems.append(tvItem) // 🔹 변환한 아이템을 배열에 추가
    }
    
    snapshot.appendItems(tvItems, toSection: .tv) // 📺 변환된 TV 데이터를 해당 섹션에 추가
}

if !viewModel.people.isEmpty {
    snapshot.appendSections([.people]) // 👤 인물 섹션 추가
    
    var peopleItems: [SearchItem] = [] // 👤 인물 아이템 저장할 배열 생성
    
    for person in viewModel.people {
        let personItem = SearchItem.people(person) // 🔹 SearchItem의 .people 케이스로 변환
        peopleItems.append(personItem) // 🔹 변환한 아이템을 배열에 추가
    }
    
    snapshot.appendItems(peopleItems, toSection: .people) // 👤 변환된 인물 데이터를 해당 섹션에 추가
}