Adaptable Connectivity
네트워크가 연결되지 않은 상태에서 발생한 Task를 대기상태로 두었다가 연결되면 실행되도록 구현한다.
lazy var session: URLSession = { [weak self] in
let config = URLSessionConfiguration.default
config.waitsForConnectivity = true
let session = URLSession(configuration: config, delegate: self, delegateQueue: OperationQueue.main)
return session
}()
SessionConfiguration의 waitsForConnectivity 속성을 true로 변경한다.
이제부터 해당 Session을 사용해 생성되는 Task는 전부 네트워크 연결 유실 시 연결이 될 때까지 대기할 수 있다.
이러한 경우 처리되지 않은 요청이 존재한다고 사용자에게 알리는 것이 바람직하다.
extension AdaptableConnectivityViewController: URLSessionDownloadDelegate {
func urlSession(_ session: URLSession, taskIsWaitingForConnectivity task: URLSessionTask) {
sizeLabel.text = "Waiting..."
}
}
SessionDelegate에 해당 메서드를 추가한다.
urlSession(_:taskIsWaitingForConnectivity:)
해당 메서드는 Task를 시작했을 때 사용할 수 있는 네트워크가 존재하지 않으면 호출된다.
해당 시점에서 Label에 표시하도록 수정했다.
만약 다운로드 중에 네트워크 연결이 유실된다면 이를 전환하기 위한 대기시간이 필요할 수 있다.
구현하는 방법은 두가지다.
timeoutIntervalForRequest
lazy var session: URLSession = { [weak self] in
let config = URLSessionConfiguration.default
config.waitsForConnectivity = true
config.timeoutIntervalForRequest = 5
let session = URLSession(configuration: config, delegate: self, delegateQueue: OperationQueue.main)
return session
}()
timeoutIntervalForRequest 속성을 지정하면 해당 시간 이후에는 요청을 중지한다.
timeoutIntervalForResource
lazy var session: URLSession = { [weak self] in
let config = URLSessionConfiguration.default
config.waitsForConnectivity = true
config.timeoutIntervalForResource = 5
let session = URLSession(configuration: config, delegate: self, delegateQueue: OperationQueue.main)
return session
}()
timeoutIntervalForResource 속성을 지정하면 해당 시간 이후에는 요청을 중지한다.
이 둘의 차이는 Timout 판단 기준에 있다.
timeoutIntervalForRequest는 지정된 시간 내에 응답이 전달되지 않으면 timeout으로 판단한다.
timeoutIntervalForResource는 지정된 시간 내에 Task가 완료되지 않으면 timeout으로 판단한다.
이렇게 timeout으로 판단하는 경우의 에러코드는 '-1001' NSURLErrorTimedOut이다.
알림을 표시하거나 설정을 변경해야 하는 경우 해당 에러에 대응해서 동작하도록 구현하면 된다.
'학습 노트 > iOS (2021)' 카테고리의 다른 글
219. Task Scheduling (0) | 2022.09.07 |
---|---|
217. Cellular Connection (0) | 2022.09.07 |
216. Reachability (0) | 2022.09.06 |
215. Response Caching (0) | 2022.09.06 |
214. Background Download (0) | 2022.08.31 |