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 Alerts、約100 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 に答える