Я хочу убедиться, что правильно реализую URLSessionTaskDelegate и URLSessionDataDelegate. Я использую их, потому что хочу иметь возможность отслеживать прогресс. Это код до сих пор:
final public fileprivate(set) var data: Data?
final public fileprivate(set) var response: URLResponse?
final public fileprivate(set) var error: Error?
public func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive response: URLResponse, completionHandler: @escaping (URLSession.ResponseDisposition) -> Void) {
if let response = response as? HTTPURLResponse, response.statusCode == 200 {
data = Data()
}
self.response = response
completionHandler(.allow)
}
public func urlSession(_ session: URLSession, dataTask: URLSessionDataTask, didReceive data: Data) {
self.data?.append(data)
}
public func urlSession(_ session: URLSession, task: URLSessionTask, didCompleteWithError error: Error?) {
self.error = error
// ... Work with downloaded data
}
и несколько вопросов:
- Должен ли я всегда выполнять завершениеHandler в ответе didReceive, и он всегда должен быть .allow? Может быть, мне следует делать это только в том случае, если код состояния ответа равен 200?
- Является ли код состояния 200 единственным, что мне действительно нужно проверить в этом случае, и это правильное место для инициализации данных? Может быть, эта функция может выполняться несколько раз с разными кодами, и я должен относиться к каждому коду по-разному?
- Является ли didCompleteWithError единственным местом, где мне нужно указать ошибку? Может быть, ошибки тоже могут генерироваться в разных местах?
- В документации для URLResponse я вижу значение по умолчанию для ожидаемогоContentLength — NSURLResponseUnknownLength, но это значение не существует. Есть ли какое-то новое название для него сейчас?
- Есть ли что-то еще, что я должен знать, чтобы этот код был универсальным?