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 상황에서 안전하게 공유될 수 있는 타입이다.
새로 생성한 task는 정지된 상태에서 시작되기 때문에 이를 실행시키려면 resume()을 통해 재개시켜야 한다.
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에서 사용해야 한다.