본문 바로가기
🍎iOS프로그래밍

iOS- 네트워크로 데이터를 불러올때 data(contentsOf:)메서드를 사용하면 안되는 이유

by 둥둥동동# 2023. 8. 21.
728x90

 

네트워크로 데이터를 불러올 때 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
            }
        }
    }
}

구글링을 할 때 가장 많이 나오는 방식이기도 하고 실제 동작하는데 아무런 문제가 없어 보이기 때문입니다.

하지만 애플문서와 스택오버플로우의 의견은 달랐습니다.

애플문서에 중요하다고 언급될 만큼 해당 메서드는 네트워크로 데이터를 불러오는데 적합하지 않다고 말합니다.

https://developer.apple.com/documentation/foundation/nsdata/1413892-init

 

해당 메서드를 사용하지 말아야할 가장 큰 이유는 동기방식의 메서드이기 때문입니다. 이미지같은 큰 데이터를 불러올 때는 메인쓰레드가 블락되면서 사용자 경험에 악영향을 줄 수 있습니다.

그렇다고 위의 코드처럼 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

https://inuplace.tistory.com/1230

728x90

댓글