2011-09-21 33 views
0

我是用於HTTP請求的uisng ASIHTTPRequest,並將結果保存到單獨的文件中。由於該文件預計會很大,它應該也能恢復。如何取消錯誤響應HTTP代碼的ASIHTTPRequest?

request.allowResumeForFileDownloads = YES; 
request.downloadDestinationPath = destFile; 
request.temporaryFileDownloadPath = tmpFile; 

我用下面的選擇:

request.didFinishSelector = @selector(didFinishRequest:); 
request.didFailSelector = @selector(didFailRequest:); 
request.didReceiveResponseHeadersSelector = @selector(didReceiveResponse:); 

現在我有鬆動連接,不同的代理,等測試不同的情況下,發現一個問題,即如果接收到響應與其他類似的代碼503或其他東西,那麼ASIHTTPRequest仍然會將結果保存到臨時文件中,這是錯誤的,因爲數據是一些隨機的錯誤HTML頁面(如果存在部分下載的文件,則將其附加到它使我的數據損壞)。

所以我想要做的是檢查響應代碼,如果它不是2XX,然後取消請求而不保存任何東西。

這並沒有幫助:

- (void)didReceiveResponse:(ASIHTTPRequest*)request { 
    if (request.responseStatusCode < 200 || request.responseStatusCode >= 300) { 
     [request clearDelegatesAndCancel]; 

任何想法?

+1

會發生什麼事,當您嘗試發佈的代碼?你有沒有試過步入[請求clearDelegatesAndCancel]找出爲什麼它不會停止下載? –

回答

0

到目前爲止,還沒有找到一個乾淨的解決方案,所以有一點點黑客:

在ASIHTTPRequest.m中,我們需要改變,以waitUntilDone方法readResponseHeaders的最後一行:YES(線2281)所以代碼不會繼續運行和處理數據。

[self performSelectorOnMainThread:@selector(requestReceivedResponseHeaders:) withObject:[[[self responseHeaders] copy] autorelease] waitUntilDone:YES]; 

不幸的是,在didReceiveResponse:選擇我們不能簡單地調用clearDelegatesAndCancel方法,因爲它會掛,因爲ASIHTTPRequest鎖的線程。所以我也只是使用了一些我從ASIHTTPRequest接過方法:

[request setComplete:YES]; 
    [request setDownloadComplete:YES]; 
    [request requestFinished]; 
    [request markAsFinished]; 

雖然,前兩種方法都沒有公開和Xcode中列出了警告,但它仍然有效。

順便說一句,只有2天前,我看到了一個post說,不被支持ASIHTTPRequest更多:(

相關問題