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
}
そしていくつかの質問:
- didReceive 応答で常に completionHandler を実行する必要があり、常に .allow にする必要がありますか? 応答ステータス コードが 200 の場合にのみこれを行う必要がありますか?
- この場合、実際に確認する必要があるのはステータス コード 200 だけですか。また、これはデータを初期化する適切な場所ですか? たぶん、この関数は異なるコードで数回実行される可能性があり、コードを別の方法で処理する必要がありますか?
- エラーを割り当てる必要があるのは didCompleteWithError だけですか? たぶん、別の場所でもエラーが発生する可能性がありますか?
- URLResponse のドキュメントでは、expectedContentLength のデフォルト値が NSURLResponseUnknownLength であることがわかりますが、この値は存在しません。現在、新しい名前はありますか?
- このコードが普遍的であるために知っておくべきことは他にありますか?