2016-11-12 12 views
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. didComCompleteWithErrorはエラーを割り当てる必要がある唯一の場所ですか?たぶん、別の場所でもエラーが発生する可能性がありますか?
  4. URLResponseのドキュメントでexpectedContentLengthのデフォルト値がNSURLResponseUnknownLengthですが、この値は存在しません。今、新しい名前がありますか?
  5. 私はこのコードが普遍的であるように知っておくべきことがありますか?

答えて

1
  1. status codeが200でない場合は、多くの場合、レスポンスのボディは、それが200でなかったので、あなたはおそらく、その情報をキャプチャし続けたい理由を診断するのに役立つ情報が含まれています。おそらくその状態コードチェックをdidCompleteWithErrorに移してみましょう。

  2. 私は一般的に200を期待しているため、200だけをチェックします。技術的には、2xxコードはすべて「成功」コードなので、すべて成功したと考えてください。それはあなた次第です。

  3. didCompleteWithErrorは接続に関連する唯一のエラーです。理論的には、urlSession(_:didBecomeInvalidWithError:)にチェックしてください。また、2xx以外のステータスコードを取得した場合や、上位レベルで応答の解析が失敗した場合は、独自のエラーコードを割り当てることもできます。

  4. スウィフト3から適切な定数が定義されていないようですが、ヘッダーを見ると、値は-1ですが、しばしばresponse.expectedContentLength < 0をチェックするだけです。

+0

ありがとうございます。だから、didReceiveレスポンスに常にdata = Data()を作成し、didCompleteWithErrorの後にステータスコードをチェックします。 –

関連する問題