네트워크로 데이터를 불러올 때 data(contentsOf:)메서드를 사용하면 안되는 이유
네트워크로 데이터를 불러올 때 data(contentsOf:)메서드를 사용하면 안되는 이유를 알아보자
data(contentsOf:)메서드는 동기방식이다
아마 많은 분들이 라이브러리 없이 데이터를 불러올 때 아래와 같이 data(contentsOf:)메서드를 사용할 것입니다.
DispatchQueue.global().async { [weak self] in
if let data = try? Data(contentsOf: url) {
if let image = UIImage(data: data) {
DispatchQueue.main.async {
self?.image = image
}
}
}
}
구글링을 할 때 가장 많이 나오는 방식이기도 하고 실제 동작하는데 아무런 문제가 없어 보이기 때문입니다.
하지만 애플문서와 스택오버플로우의 의견은 달랐습니다.
애플문서에 중요하다고 언급될 만큼 해당 메서드는 네트워크로 데이터를 불러오는데 적합하지 않다고 말합니다.
해당 메서드를 사용하지 말아야할 가장 큰 이유는 동기방식의 메서드이기 때문입니다. 이미지같은 큰 데이터를 불러올 때는 메인쓰레드가 블락되면서 사용자 경험에 악영향을 줄 수 있습니다.
그렇다고 위의 코드처럼 concurrency방식의 global큐에서 실행시키면 해결될까요? 당장은 괜찮아 보이지만 백그라운드 쓰레드 하나를 블락시키는것이기 때문에 여전히 성능에 악영향을 줄 여지가 있습니다.
URLSession은 completion을 통해 http 통신 오류인지, 컨텐츠의 오류인지확인할 수 있지만 data(contentsOf:)메서드는 오류의 추적도 불가능합니다.
결론: Kingfisher나 URLSession메서드를 활용하자
출처
https://stackoverflow.com/questions/59722670/data-contentsof-yields-nil-but-the-url-is-valid
https://developer.apple.com/documentation/foundation/nsdata/1413892-init
'🍎iOS프로그래밍' 카테고리의 다른 글
vision OS 맛보기 - Xcode에서 vision OS 앱 체험하기 (0) | 2023.09.01 |
---|---|
Swift - [성능최적화]를 해보자 (dynamic dispatch편) (0) | 2023.08.08 |
Swift - [성능최적화]final 키워드를 알아보자(static dispatch, dynamic dispatch) (0) | 2023.08.07 |
Xcode - 오류, Package.resolved file is corrupted or malformed 해결하기 (0) | 2023.06.02 |
댓글