0

我試圖讓UIProgressView,NSURLConnection,NSOperation和NSOperationQueue一起工作。 下面是代碼:http://pastie.org/4080576連接:didReceiveResponse:從NSURLConnectionDelegate從未發射

問題: connection:DidReceiveData:從來沒有所謂的:立即執行將-start(),通過-main(),然後-connection:DidReceiveResponse:,回到-main()(有時),最後到-connectionDidFinishDownloading:destinationURL:

當我試圖從這個鏈接下載圖片: http://upload.wikimedia.org/wikipedia/commons/4/41/Kharkov_picture_1787.jpg
我得到這樣的輸出:

2012-06-13 19:43:06.189 downloadingFilesInOpQueue [5070:F803]所獲 響應:2012 -06-13 19:43:06.190 downloadsFilesInOpQueue [5070:f803]文件大小是:3075638建議 文件名是:Kharkov_picture_1787.jpg 2012-06-13 19:43:12.476 downloadingFilesInOpQueue [5070:f803]完成下載。收到0 字節

另外,我想不通的地方connection:didReceiveResponse:屬於: NSURLConnectionDelegate或NSURLConnectionDataDelegate。

P.S.如果有一些風格問題,我很樂意聽到他們的消息。謝謝。

回答

1

我強烈懷疑您的「繁忙」while循環正在消耗底層的運行循環的執行,並阻止NSURLConnection在數據到達時處理數據。

看你pastie.org代碼,這裏是你的主要元兇:

while (![self isFinished]) { 
    ... 
    while ([self fileSize] == 0) {} 
    while ([self receivedDataLength] == 0) {} 
    ... 
} 

忙循環這應該幾乎從來沒有在iOS中使用。 iOS編程主要是事件驅動的,特別是NSURLConnection。相反,更新你的UIProgressView迴應connection:DidReceiveData:

老實說,編碼你自己的NSURLConnection處理程序是一種混亂的痛苦。我強烈建議你看看使用一個處理一些困難的開源庫。這裏的兩位體面的退房:

  1. https://github.com/AFNetworking/AFNetworking
  2. https://github.com/pokeb/asi-http-request
+0

比你了,我的想法是一樣的。 我會重構這些循環,但我不能使用這樣的外部庫。 另外,我知道webkit的方式來做到這一點,但它也不是我的方式。 再次感謝您。 – folex

+0

順便說一句,我只是不想在整個程序中延伸一個任務。在我看來,一項任務應該在一個地方,但我不認爲這種情況會退出。 如果你看到了,請告訴我。 – folex