✅ 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) // 👤 변환된 인물 데이터를 해당 섹션에 추가
}
'Project > MovieClip' 카테고리의 다른 글
🔥 MVVM + Combine을 통한 검색기능 구현 2편 구현 순서? (0) | 2025.02.24 |
---|---|
🤔 createDataSource() 메서드에서 "검색 결과 전체보기" 버튼 동작 (0) | 2025.02.24 |
🔥 MVVM + Combine을 통한 검색기능 구현 1편 패턴 비교 (0) | 2025.02.24 |
✅ MVVM + Combine로 설계한 검색에서 번역 기능 적용하는 최적 방법 (0) | 2025.02.23 |
❌ 에러 분석 - UICollectionView 2번 dequeue... (0) | 2025.02.23 |