3

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
}

そしていくつかの質問:

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

1 に答える 1