학습 노트/iOS (2021)

218. Adaptable Connectivity

걔랑계란 2022. 9. 7. 19:12

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:)

 

Apple Developer Documentation

 

developer.apple.com

해당 메서드는 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
218. Adaptable Connectivity  (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