2012-02-08 97 views
2

我正在使用AFNetworking並非常喜歡它。 我需要從我的服務器獲取JSON數據,並且沒關係,它完美地工作。AFNetworking + JSON +進度下載

我添加了setDownloadProgressBlock,但我認爲它不能與JSON下載一起工作:也許無法得到估計的字節數量下載。

我的代碼:

NSMutableURLRequest *request = [[VinocelaHTTPClient sharedClient] requestWithMethod:@"GET" path:@"ws/webapp/services/pull" parameters:nil]; 

    AFJSONRequestOperation *operation = [AFJSONRequestOperation JSONRequestOperationWithRequest:request 
                         success:^(NSURLRequest *request, NSHTTPURLResponse *response, id JSON) 
    { 
    } 

    } failure:^(NSURLRequest *request, NSHTTPURLResponse *response, NSError *error, id JSON) 
    { 
    }]; 

    [operation setDownloadProgressBlock:^(NSInteger bytesWritten, NSInteger totalBytesWritten, NSInteger totalBytesExpectedToWrite) { 
    NSLog(@"Get %d of %d bytes", totalBytesWritten, totalBytesExpectedToWrite); 

    }]; 

    [operation start]; 

而且我的結果:

得-1的27129字節

獲取127481 -1字節

獲取的-1個字節176699

因此,我認爲AFNetworking下載JSON數據時不能估算出真正的大小,與zip文件或圖像相反?

回答

2

從細讀源代碼看來,進度回調只是通過緩存的內部NSHTTPURLResponse對象的expectedContentLength屬性。因此,如果由於某種原因,服務器沒有正確發送頭文件,並且/或者正在進行分塊傳輸編碼,那麼該值是未知的,並且返回值NSURLResponseUnknownLength(恰好定義爲-1)。

嘗試檢查由您的應用程序上下文之外的HTTP請求返回的標頭。如果您得到一個價值理性的Content-Length標題,則問題可能在於AFNetworking本身。如果不存在,問題在於服務器。我從來沒有見過HTTP服務器使用分塊傳輸編碼發送JSON響應(大多數情況下,內容大小應該相對較小,並且在發送標頭時已知),但是在規範中是這樣做的。 OK Warrenm。

+1

OK Warrenm。我打印響應頭並且內容長度不存在。你是對的。我在我的服務器上使用Rails 3。我會試着找出爲什麼它不存在,並可能在Rails或類似的東西中強制它。好吧,我在我的Rails配置中添加了這個:config.middleware.use Rack :: ContentLength。但結果很奇怪:「Content-Length」= 2658; =>獲取2658字節的176699。我確定JSON的字節數超過2658 ... – 2012-02-09 07:55:12

+0

聽起來像內容長度的不匹配可能與完整的和gzip的大小之間的差異有關。不知道這是否有幫助... – mattt 2012-02-13 05:13:08