2

我有NSURLSession的下面的實現。NSURLSession委託didCompleteWithError未調用

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]]; 
} 

,我已經實施了下面委託methds:

- (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,因此while循環不會退出,即使指定了10秒超時並且我的應用程序崩潰了內存警告

我確實收到了didReceiveData,didReceiveResponse回調在所有情況下.have沒有檢查didReceiveChallenge回調,但因爲它需要在這裏設置HTTPs。

所以,我有以下幾個問題要問,如果你能幫助我:

1)爲什麼didCompleteWithError回調當網絡出現故障沒有收到?

2)考慮到沒有網絡問題,是didCompleteWithError成功完成任務時收到的回調函數?如果不是,回調函數會表示完成任務,如connectionDidFinishLoading使用NSURLConnection的時候?

我在啓動任務時在請求參數中使用了cachepolicy。是否因爲這樣,didcompletewitherror不是叫做n而是應該實施緩存委託?

夥計們,請幫忙。我被卡住了。

三江源

+2

請勿觸摸運行循環,除非項目是沒有隱式運行循環的命令行界面 – vadian

+0

其他委託方法如何?當網絡中沒有出現故障時他們會被叫到嗎? –

+0

好的。我明白了你的觀點。但爲什麼我的委託方法不被調用?你能提出什麼建議嗎? – CodeTry

回答

0

delegateQueue:[NSOperationQueue mainQueue] ,而不是代替delegateQueue的:零的伎倆。 我仍然不知道如何。但是,這個問題沒有了。 有人可以解釋這是如何工作的?

+0

我仍然有問題,即使我設置了委託隊列:NSOperationQueue.mainQueue,我的委託回調仍然沒有被調用。 – mixtly87

0

你的循環「while(!finished)」是非常糟糕的做法。基本上,下載任務是異步操作,但是您使用while循環阻止線程,並強制下載任務在該線程中完成。這可能會影響系統行爲。

我相信刪除此循環將解決您的問題。