0

我正在使用 RestKit 在我的应用程序中下载多个文件。只要文件不是太大,一切都像魅力一样。不幸的是,我尝试下载一个大视频文件(大约 230 MB)并得到一个memory warning应用程序崩溃。

我从以下行开始下载

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

在委托方法中,我将其本地保存在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];
}

我检查了 Instruments 中的应用程序是否存在内存泄漏,并看到它在出现Live Bytes之前一直在*Overall Allocations*上升。虽然没有泄漏。Low Memory Alerts100 MB

删除负责保存文件的行 ( [[response body] writeToURL:url atomically:YES];) 并没有改变任何东西,所以我猜问题出在 RestKit 的某个地方。

在研究时,我偶然发现了一种允许直接下载文件的方法,ASIHTTPRequest并认为类似的方法可以解决问题,但不确定。

RestKit 中是否有可能直接下载我错过的?

或者

有没有更好的方法来使用我应该知道的 RestKit 下载文件?

4

1 回答 1

4

我遇到了同样的问题,不幸的是,除了修改本地 RestKit 副本之外,我认为没有其他办法。问题出在- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data,正好在[_body appendData:data];。如您所见,RestKit 将响应的主体保存在内存中,并在从服务器发送字节时附加字节。这就是您收到内存不足警告的原因。我的解决方案是向 RKRequest 添加一个属性并将数据直接写入文件系统,具体取决于请求是否为大文件请求:

- (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 扔给它,它会自动为您附加它。

于 2012-05-22T15:31:14.983 回答