ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Data(contentsOf:)? URLSession?
    Swift 2022. 8. 1. 16:26

    Data(contentsOf:)

    이미지를 받아와서 보여주는 가장 기본적인 예제 중 이런것이 있다.

    DispatchQueue.global().async {
                do {
                    let image = try Data(contentsOf: self.imageUrl)
                    DispatchQueue.main.async {
                        self.imageView.image = UIImage(data: image)
                    }
                } catch {
                    print(error)
                }
            }

    개인적으로 이런 식의 데이터 통신을 접한 첫 것은 그 유명한 Standford iOS강의 일것이다.

    물론 지금 와선 그 의도를 파악 할 수 있지만(빨리 보여줘야 하니까…ㅎㅎ)

    처음 접한 방식이 이렇다 보니 당연히 네트워크 통신은 이런식으로 하는줄 알았다.

     

    통신은 무조건 DispatchQueue를 이용해서 비동기적으로 처리해주고 그 안에서 UI 업데이트는 Main 쓰레드에서 해주고 어쩌고…

    뭐 물론 맞는 말이다. 비용이 많이 드는 통신은 비동기적으로 해주고 UI 업데이트는 Main 쓰레드에서.

    그럼 해결 된거 아닌가? 비동기적으로 실행되니 앱의 실행 흐름을 방해 할 일도 없고 원하는 결과도 나온다.

     

    저 Data(contentsOf:)만 있으면 될것 같다.

     

    먼저 공식 문서를 보자.

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

     

    Apple Developer Documentation

     

    developer.apple.com

    뭔가 눈에 띄게 강조 되어 있다.

    동기식 초기화를 이용해서 네트워크 기반 URL을 요청하지 마시오.

    애플에서 하지말란다. 단, File 기반 Url은 해도 된다고 돌려서 말하는 것 같다.

    그 이유는 느린 네트워크가 스레드를 차단시키고 심지어 앱을 강제로 종료 시킬수도 있다고 한다.

    하지 말라면 말아야지… 하지만 우린 비동기 처리를 해주잖아? 그럼 해도 되는거 아닌가?

    URLSession

    우리가 iOS에 대해 공부하다 보면 네트워크 통신 방법중 URLSession을 통한 통신을 반드시 접하게 된다.

    URLSession에 다양하고 유용한 기능들이 있지만 결국 쓰는 이유는 하나이다. 바로 URL을 기반으로 통신을 하는것.

     

    애플 공식문서 중 Fetching Website Data into Memory를 보자.

    https://developer.apple.com/documentation/foundation/url_loading_system/fetching_website_data_into_memory

     

    Apple Developer Documentation

     

    developer.apple.com

    그림을 보면 URLSession이 만든 URLSessionDataTask를 통해 얻은 data, request, error를 CompletionHandler로 전달 가능하다.

     

    가장 기본적인 URLSession의 가장 강력한 기능은 통신 시 에러처리를 할 수 있다는 것이다.

     

    Data(contentsOf:)을 사용시 Do-Catch 문으로 알수 있는건 고작 이 URL의 유효성(이 URL에서 데이터를 추출 할수 있는가) 뿐이다.

    네트워크 문제인지, 서버의 문제인지, 데이터의 문제인지 알수 있는 길은 없다.

     

    네트워크 통신, 특히 많은 비용이 발생하는 경우 Data(contentsOf:)의 사용을 지양하자.

     

     

    'Swift' 카테고리의 다른 글

    Swift) 성능 최적화 - Dispatch와 메모리 할당  (0) 2022.08.30
    Swift) URLSession Network Layer  (1) 2022.08.10
    Swift) json 다루기  (0) 2021.06.16
    Swift) API Design Guidelines  (0) 2021.06.10
    Swift) 함수 타입  (0) 2020.11.18

    댓글

Designed by Tistory.