2012-05-22 37 views
0

我正在使用RestKit在我的應用程序中下載多個文件。只要文件不是太大,一切都像魅力一樣。不幸的是,我試圖下載一個大的視頻文件(大約230 MB),並得到一個memory warning和應用程序崩潰。使用RestKit下載並保存大文件

我開始下載使用以下行

[[RKClient sharedClient] get:[NSString stringWithFormat:@"/%@", listItem.filename] delegate:self]; 

在委託方法我localy保存在appDirectory/Library/Caches/

- (void)request:(RKRequest *)request didLoadResponse:(RKResponse *)response 
{ 
    NSURL * url = [NSURL fileURLWithPath:[cacheDirectory stringByAppendingPathComponent:response.URL.lastPathComponent]]; 

    [[response body] writeToURL:url atomically:YES]; 
} 

我已經檢查了儀器的應用程序的內存泄漏,看到Live Bytes*Overall Allocations*Low Memory Alerts約在100 MB之前保持上升。雖然沒有泄漏。

刪除負責保存文件的行([[response body] writeToURL:url atomically:YES];)並沒有改變任何內容,所以我猜這個問題在RestKit的某個地方。

雖然研究我偶然發現了一個method of ASIHTTPRequest,它允許直接下載文件,並認爲類似的東西可以解決問題,但不知道。

有沒有可能在RestKit直接下載,我錯過了?

有沒有更好的方式來下載與RestKit,我應該知道的文件?

回答

4

我遇到了同樣的問題,不幸的是我不認爲有其他辦法可以修改本地RestKit副本。問題位於- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data,正好在[_body appendData:data];。正如你所看到的,RestKit將響應的主體保存在內存中,並在從服務器發送時追加字節。這就是爲什麼你得到低內存警告。我的解決辦法是將屬性添加到R​​KRequest並根據數據直接寫入文件系統,如果請求是一個很大的文件請求與否:

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { 
if ([_request dontKeepBytesInMemory]) { 
    if ([[_request delegate] respondsToSelector:@selector(request:didReceivedData:totalBytesExectedToReceive:)]) { 
     [[_request delegate] request:_request didReceivedData:data totalBytesExectedToReceive:_httpURLResponse.expectedContentLength]; 
    } 
} else { 
    [_body appendData:data]; 
    if ([[_request delegate] respondsToSelector:@selector(request:didReceivedData:totalBytesReceived:totalBytesExectedToReceive:)]) { 
     [[_request delegate] request:_request didReceivedData:[data length] totalBytesReceived:[_body length] totalBytesExectedToReceive:_httpURLResponse.expectedContentLength]; 
    } 
} 

}

我還需要在該協議附加RKRequest委託方法,所以我可以分別處理大的迴應。最初的代理方法定義了totalBytesReceived,它只是[_body length],但是如果直接將文件寫入文件系統,則只需檢查當前文件大小即可跟蹤下載狀態。如果您正在尋找一種將字節直接保存到文件系統的好方法,請查看NSFileHandle類 - 它支持文件偏移,因此您只需將任何NSData放在它上面,它就會自動爲您添加它。

+0

嘿,謝謝你的回答。我還沒有時間研究這一點,但這似乎是合法的。希望能很快回來,並在出現問題時給予反饋... – taymless

+0

你能分享你的代碼嗎?我對使用restkit下載大文件非常感興趣... – fvisticot

+0

不幸的是,我現在無法訪問代碼(更換僱主),但是我很樂意指導您,如果您告訴我您在哪裏卡住了。 – lawicko

相關問題