以下の実装がありNSURLSession
ます。
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
self.session = [NSURLSession sessionWithConfiguration:configuration
delegate:self
delegateQueue: nil];
NSURLSessionDataTask *task = [self.session dataTaskWithRequest:request];
[task resume];
while(!finished) {
[[NSRunLoop currentRunLoop] runMode:NSDefaultRunLoopMode beforeDate:[NSDate dateWithTimeIntervalSinceNow:100000]];
}
そして、私は以下のデリゲートメソッドを実装しました:
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveData:(NSData *)data
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveResponse:(NSURLResponse *)aresponse
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didCompleteWithError:(NSError *)error
- (void)URLSession:(NSURLSession *)session dataTask:(NSURLSessionDataTask *)dataTask didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge
completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition,
NSURLCredential *credential))completionHandler
上記のwhileループの「終了」変数は、didCompleteWithError
デリゲートが受信されたときに1に設定され、ネットワークダウンなどの問題があることを示します...
ネットワークがダウンすると、 が取得されないためdidCompleteWithErrorcallback
、10 秒のタイムアウトが指定されていても while ループが終了せず、アプリがクラッシュしてMemory warningが表示されます。
私はすべてのシナリオでdidReceiveData、didReceiveResponseコールバックを適切に受け取ります.didReceiveChallengeコールバックをチェックしていませんが、ここではHTTPsセットアップが必要です.
それで、私はあなたが私を助けることができるなら、私は尋ねたい次の質問があります:
1)didCompleteWithError
ネットワークがダウンしているときにコールバックが受信されないのはなぜですか?
2) ネットワークの問題がないことを考慮して、タスクが正常に完了したときにコールバックが受信されますか? いいえの場合didCompleteWithError
、どのようなコールバックがタスクの完了を示しますか?connectionDidFinishLoading
NSURLConnection
タスクの開始時に、リクエスト パラメータで cachepolicy を使用しました。このため、didcompletewitherror は n と呼ばれず、代わりにキャッシング デリゲートを実装する必要がありますか??
皆さん、助けてください。ハマった。
ありがとうございました