boraBong

[iOS] 네트워크 기반에서 URL을 요청할 때 - Data(contentsOf: url) 메서드 대신 dataTask(with:completionHandler:) 메서드를 사용하자 본문

iOS

[iOS] 네트워크 기반에서 URL을 요청할 때 - Data(contentsOf: url) 메서드 대신 dataTask(with:completionHandler:) 메서드를 사용하자

보라봉_ 2022. 11. 14. 21:15
728x90

네트워크 기반에서 URL을 요청할 때 Data(contentsOf: url) 메서드보다 dataTask(with:completionHandler:) 메서드를 권장하는데요, 그 이유에 대해서 알아봅시다!

 

🍎 Data(contentsOf: url)

→ 동기적으로 데이터를 다운받는 방법

init?(contentsOf url: URL)

Data(contentsOf: url) 메서드를 사용하여 data://URL을 NSData 개체로 변환합니다. 
또한 짧은 파일을 동기적으로 읽는 데 사용할 수도 있습니다.

 

⚠️ 네트워크 기반에서 URL을 요청할 때Data(contentsOf: url) 메서드를 권장하지 않는 이유

  • Data(contentsOf: url) 동기식 이니셜라이저를 사용하여 네트워크 기반 URL을 요청하지 마십시오.
    네트워크 기반 URL의 경우 이 방법은 느린 네트워크에서 수십 초 동안 현재 스레드를 차단하여 사용자 경험을 저하시킬 수 있으며 iOS에서는 앱이 종료될 수 있습니다.
  • Data(contentsOf: url) 메서드는 메인 스레드에서 동기적으로 수행됩니다. 따라서 이미지를 다운로드 하고 뷰에 로드하는데 많은 시간이 소요될 경우 앱의 UI가 마비될 수 있는 위험이 있어 주의해야 하는 것입니다!

 

💡 그렇다면, GCD의 global 스레드로 감싸준다면 해결될 수 있지 않을까?

  • 메인 스레드가 마비되는 문제는 해결할 수 있겠지만, global 스레드에서 작업이 수행된다 하더라도 작업 처리 방식이 비동기 방식이 아닌 “동기 방식”임에 주의해야 합니다.
  • global 스레드에서 수행된다 하더라도 특정 대기열 큐 하나는 작업이 끝나기 전까지 제한되기 때문입니다.

 

 

Data(contentsOf: url) 메서드는 동기적인 방식으로 URL을 다운받기 때문에 위와 같은 문제의 가능성이 있습니다.

따라서 Apple 개발자 문서에서는 같은 동작을 수행하지만 동작을 동기적으로 제한하지 않는 URLSession의 기본 메서드인 dataTask(with:completionHandler:) 를 활용할 것을 권장합니다.

 

🍎 dataTask(with:completionHandler:)

→ URLSession 클래스의 기본 메서드

 
func dataTask(
    with url: URL,
    completionHandler: @escaping @Sendable (Data?, URLResponse?, Error?) -> Void
) -> URLSessionDataTask
지정한 URL의 내용을 검색한 다음 완료 시 처리기를 호출하는 작업을 만듭니다.

completionHandelr를 통해 URL 다운로드 작업 수행 완료 후의 작업 처리가 가능하며,
iOS의 네트워크 통신 기본 클래스인 URLSession의 기본 메서드이므로 에러 발생시 에러 처리가 용이하다는 장점이 있습니다.

 

 

 

<참고 글>

 

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

 

Apple Developer Documentation

 

developer.apple.com

https://developer.apple.com/documentation/foundation/urlsession/1410330-datatask

 

Apple Developer Documentation

 

developer.apple.com

https://stackoverflow.com/questions/55332857/what-is-difference-between-urlsession-vs-gcd-in-terms-of-download-image-from-ima

 

What is difference between URLSession vs GCD in terms of download image from image url?

What is difference between URLSession vs DispatchQueue.global().async + Data(contentsOf: ) in terms of download images from image urls? func loadImageWithUrlSession() { guard let url = URL(str...

stackoverflow.com

https://inuplace.tistory.com/1230

 

[iOS] Remote data를 가져올 때 Data(contentsOf:)를 사용하면 안되는 이유

Remote data를 가져올 때 Data(contentsOf:)를 사용하면 안되는 이유 일단 이 메서드는 동기적으로 작동한다는 것이 기본입니다. 따라서 현재작업중인 스레드의 모든 작업을 해당 작업을 수행하는 동안

inuplace.tistory.com

 

반응형
Comments