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は、このケースで本当に確認する必要がある唯一のものですか?これはデータを初期化するための正しい場所ですか?たぶん、この機能は異なるコードで数回実行することができ、私は異なるコードを扱うべきですか?
- didComCompleteWithErrorはエラーを割り当てる必要がある唯一の場所ですか?たぶん、別の場所でもエラーが発生する可能性がありますか?
- URLResponseのドキュメントでexpectedContentLengthのデフォルト値がNSURLResponseUnknownLengthですが、この値は存在しません。今、新しい名前がありますか?
- 私はこのコードが普遍的であるように知っておくべきことがありますか?
ありがとうございます。だから、didReceiveレスポンスに常にdata = Data()を作成し、didCompleteWithErrorの後にステータスコードをチェックします。 –