반응형
250x250
05-19 09:27
- Today
- Total
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | |||||
| 3 | 4 | 5 | 6 | 7 | 8 | 9 |
| 10 | 11 | 12 | 13 | 14 | 15 | 16 |
| 17 | 18 | 19 | 20 | 21 | 22 | 23 |
| 24 | 25 | 26 | 27 | 28 | 29 | 30 |
| 31 |
Tags
- 감성 에세이
- 알고리즘
- coding test
- swift
- 프로그래머스 swift
- 정렬알고리즘
- Design Pattern
- swift split
- swift 코딩테스트
- 스위프트디자인패턴
- Algorithm
- 코테
- programmers
- sort
- 자료구조
- 코딩테스트
- swift 알고리즘
- 프로그래머스
- 명언
- 다트
- dart
- 인생 명언
- programmer
- datastructure
- 디자인패턴
- 감성에세이
- rxswift
- 스위프트
- 정렬
- 프로그래머스 레벨2
Notice
Recent Posts
Recent Comments
Link
Archives
Bill Kim's Life...
[iOS] 이미지 깜빡임 & 잘못된 이미지 표시 — 비동기 로딩의 함정 본문
728x90
반응형
개요
iOS에서 자주 발생하는 문제:
👉 스크롤하면 이미지가 바뀌거나 깜빡임
예:
- 다른 셀의 이미지가 순간적으로 보임
- 이미지가 늦게 바뀜
- 빠르게 스크롤 시 엉뚱한 이미지 표시
의미
👉 비동기 이미지 로딩 + 셀 재사용이 결합된 문제
- 이미지 요청은 늦게 완료됨
- 그 사이 셀은 이미 재사용됨
→ 결과:
“요청한 셀 ≠ 현재 셀”
문제 코드
func configure(with item: Item) {
loadImage(url: item.imageURL) { image in
DispatchQueue.main.async {
self.imageView.image = image // ❌ 잘못된 셀에 들어갈 수 있음
}
}
}
👉 문제:
- 이미지 요청이 늦게 완료됨
- 셀은 이미 다른 데이터로 바뀜
해결 코드
방법 1: 이미지 초기화 (기본)
imageView.image = nil
👉 이전 이미지 잔상 제거
방법 2: URL 비교로 방어 (핵심)
var currentURL: URL?
func configure(with item: Item) {
currentURL = item.imageURL
imageView.image = nil
loadImage(url: item.imageURL) { [weak self] image in
guard let self = self else { return }
if self.currentURL == item.imageURL {
DispatchQueue.main.async {
self.imageView.image = image
}
}
}
}
👉 핵심:
- “요청한 이미지 == 현재 데이터”일 때만 적용
방법 3: 라이브러리 사용 (실무 추천)
👉 직접 구현 대신:
- Kingfisher
- SDWebImage
→ 캐싱 + cancel 자동 처리
한 줄 정리
👉 비동기 + 재사용 = 항상 불일치 가능 → URL 체크로 막아라
728x90
반응형
'DEV Tips > iOS' 카테고리의 다른 글
| [iOS] Timer 메모리 누수 — invalidate 안 하면 앱이 계속 살아있다 (0) | 2026.03.22 |
|---|---|
| [iOS] NotificationCenter 버그 — removeObserver 안 하면 생기는 문제 (0) | 2026.03.22 |
| [iOS] UITableView 셀 재사용 버그 — 데이터가 섞이는 진짜 이유 (0) | 2026.03.22 |
| [iOS] weak vs unowned — iOS에서 크래시 나는 진짜 이유 (0) | 2026.03.22 |
| [iOS] UI 멈춤 현상 — DispatchQueue 잘못 쓰면 앱이 멈춘다 (0) | 2026.03.22 |
Comments
