URLSession/네트워크 통신 - 공부하다 생긴 의문점

이지수·2023년 6월 2일
0

Swift학습

목록 보기
3/14
post-thumbnail

의문점

  • URLSession.dataTask는 왜 아무것도 수행하지 않는가?
    • → dataTask()의 정확한 역할은 무엇일까?
    • → resume()은 무엇을 수행하는가?

정보

URLSession.dataTask(with:completionhandler:)

  • Summary
    Creates a task that retrieves the contents of the specified URL, then calls a handler upon completion.

  • Declaration
    func dataTask(with url: URL, completionHandler: @escaping @Sendable (Data?, URLResponse?, Error?) -> Void) -> URLSessionDataTask

    completion handler 선언에 @escaping과 @Sendable이 사용되었다. 무슨 의미인가?
    - @escaping: 함수가 종료되고 실행되는 클로저
    - @Sendable: 프로토콜. concurrencey 상황에서 안전하게 공유될 수 있는 타입이다.

Resume()

  • Returns
    The new session data task.
  • Discussion
    Newly-initialized tasks begin in a suspended state, so you need to call this method to start the task.

    새로 생성한 task는 정지된 상태에서 시작되기 때문에 이를 실행시키려면 resume()을 통해 재개시켜야 한다.

URLSessionDataTask

dataTask()는 URLSessionDataTask를 반환한다.

URLSessionDataTask는 앱 메모리에 바로 데이터를 반환한다. 이때 데이터는 하나이상의 NSData 객체이다.

dataTask() 동작 중 urlSession(_:dataTask:willCacheResponse:completionHandler:)이 수행되어 data task가 받은 응답이 캐싱될지 묻는다

애플 개발자 문서 Fetching Website Data into Memory 참고

Fetching Website Data into Memory | Apple Developer Documentation

위 문서를 읽고 알게된 것

task를 생성하기 위해선
URLSession 클래스의 shared instance를 사용할 수도 있고, 직접 session을 생성할 수도 있다.

session의 delegate에 접근하기 위해서는 직접 session을 생성해야 한다.

session을 두 개 이상 생성하면 안된다. session을 여러번 쓰는 상황이라면 하나를 생성하여 이를 계속 써야 한다.

dataTask의 completion handler는 다음 세 가지를 충족한다.
- error parameter가 nil인지 확인
- response parameter의 status code가 success인지 확인
- 필요시 data instance 사용

completion handler는 task가 생성한 것이 아닌 다른 Grand Central Dispatch queue를 호출한다. 그러므로 data나 error 정보를 사용하기 위해선 main queue에서 사용해야 한다.


결론 및 추가 의문

  • dataTask()는 task 생성에만 관여하고 task생성을 위해선 resume()을 호출해야 한다.
  • 왜 굳이 suspended state 상태로 task가 생성되는가?
profile
iOS 개발자 꿈나무

0개의 댓글