[내일배움캠프 11주차 (03/17)]

yeseul jang·2026년 3월 17일

내일배움캠프

목록 보기
22/32

📌 flatMap vs flatMapLatest vs flatMapFirst

🔎 flatMap

📘 모든 요청 다 실행

  • 요청 여러 개 동시에 진행됨
  • 순서 보장 안됨
  • 예시
    • 여러 데이터 동시에 필요할 때
    • 로그 기록

🔎 flatMapLatest

📘 가장 최신 것만 유지 (이전 취소)

예시

  • 검색
  • 실시간 입력
  • UI 기반 요청
    -> 현재 진행중인 검색화면엔 이게 적당할 것 같음

🔎 flatMapFirst

📘 첫 요청이 끝날 때까지 다음 무시

예시

  • 로그인 버튼 연타 방지
  • 결제 요청 중복 방지

🔎 요약

  • flatMap: 다 실행
  • flatMapLatest: 최신만
  • flatMapFirst: 첫 번째만

📌 Diffable DataSource

🔎 1. 기존 UICollectionView DataSource 방식

기존 방식에서는 데이터 배열을 직접 관리하고, 변경 시 UICollectionView에 다시 그리도록 요청한다.

items = newItems
collectionView.reloadData()

또는 삽입/삭제 시 직접 indexPath를 계산해서 업데이트해야 한다.

🔎 2. 기존 방식의 문제점

📘 1) 전체 reload로 인한 성능 저하

  • reloadData()는 변경되지 않은 셀까지 모두 다시 그림

📘 2) UI 업데이트 로직이 복잡함

  • insert, delete, move 시 indexPath를 직접 계산해야 함

📘 3) 데이터와 UI 싱크 문제

  • 순서가 꼬이면 Invalid update 크래시 발생 가능

👉 즉, 데이터 상태와 UI 상태를 직접 맞춰야 하는 부담이 존재

🔎 3. Diffable DataSource란?

Diffable DataSource는 이전 데이터와 새로운 데이터의 차이를 자동으로 계산하여 UI를 업데이트하는 방식이고 UI를 직접 조작하는 대신, 현재 상태(snapshot)를 전달한다.

🔎 4. 기본 사용 구조

📘 1) DataSource 생성

dataSource = UICollectionViewDiffableDataSource<Section, String>(
    collectionView: collectionView
) { collectionView, indexPath, item in
    let cell = collectionView.dequeueReusableCell(withReuseIdentifier: "Cell", for: indexPath)
    
    var content = UIListContentConfiguration.cell()
    content.text = item
    cell.contentConfiguration = content
    
    return cell
}

📘 2) Snapshot 적용

var snapshot = NSDiffableDataSourceSnapshot<Section, String>()
snapshot.appendSections([.main])
snapshot.appendItems(items, toSection: .main)

dataSource.apply(snapshot, animatingDifferences: true)

🔎 5. 핵심 개념

📘 Snapshot

  • 현재 화면에 보여줄 데이터 상태
  • 변경된 전체 상태를 기반으로 UI를 업데이트

🔎 6. Diffable DataSource의 장점

📘 1) 자동 diff(차이) 계산

  • 변경된 부분만 업데이트

📘 2) 자연스러운 애니메이션

  • insert/delete/move 자동 처리

📘 3) 코드 안정성 증가

  • indexPath 직접 관리 불필요
  • UI와 데이터 불일치 문제 감소

📘 4) 데이터 중심 설계

  • UI를 어떻게 그리느냐 보다는 데이터가 어떻게 바뀌었느냐가 중점적

🔎 7. 기존 방식 vs Diffable 방식

기존 방식

items = newItems
collectionView.reloadData()
  • 전체 reload
  • 수동 관리 필요

Diffable 방식

items = newItems
applySnapshot(items: items)
  • 변경된 부분만 업데이트
  • 자동 diff 처리

🔎 8. 사용 시 주의사항

1) Item은 Hashable이어야 함

struct MusicItem: Hashable {
    let id: Int
    let title: String
}

2) 고유 식별자 중요

  • 같은 데이터인지 판단 기준 필요
  • 보통 id 기반으로 설계

🔎 9. 한 줄 정리

Diffable DataSource는 데이터 상태(snapshot)를 기반으로 UI를 자동 업데이트하여, 안정성과 유지보수성을 높여주는 방식이다.

profile
iOS 개발

0개의 댓글