S3GetObjectRequest有NSMutableData到數據流,以您的應用程序*身體哪裏附加所有它下載數據。
對於下載過程中的大文件,數據會不斷添加,並超過90MB的VM限制,然後應用程序被iOS殺死。
快速和骯髒的解決方法是創建您自己的S3GetObjectRequest和S3GetObjectResponse類。 AWS框架基於請求的類名(不包含最後7個字符「請求」的請求的類名稱並附加「響應」,並嘗試實例化該名稱的新類)來實例化響應。
然後覆蓋- (無效)連接:(NSURLConnection *)連接didReceiveData:(NSData *)數據一直釋放正文。
這是快速和骯髒的修復,只是因爲你仍然有不斷的數據分配,追加和釋放。但是當你處於困境時它會起作用。對於我下載150-700MB文件的用法,這個簡單的黑客程序使得應用程序的內存使用量平均爲2.55mb,+/- 0.2mb。
正如ASIHTTP庫的作者所述,它不再被維護。
請求 - LargeFileS3GetObjectRequest.h
@interface LargeFileS3GetObjectRequest : S3GetObjectRequest
@end
請求 - LargeFileS3GetObjectRequest。米
@implementation LargeFileS3GetObjectRequest
@end
響應 - LargeFileS3GetObjectResponse.h
@interface LargeFileS3GetObjectResponse : S3GetObjectResponse
@end
響應 - LargeFileS3GetObjectResponse.m
@implementation LargeFileS3GetObjectResponse
-(void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data
{
// allow original implementation to send data to delegates
[super connection:connection didReceiveData:data];
// release body and set it to NULL so that underlying implementation doesn't
// append on released object, but instead allocates new one
[body release];
body = NULL;
}
@end
希望它能幫助。
感謝您的幫助。我正在使用AWS實現,沒有ASIHTTP。當我用一款只下載了它的應用測試了我的1.5 gig下載時,它從未崩潰。如果我把這些代碼放回到應用程序中,應用程序就會崩潰。所以你認爲那裏的LArgeFileS3GetObjectResponse.m例子解決了這個問題? – user1086377
我需要一種方法來獲取某個項目的數據塊,同時下載多個文件,因此我通過ASW S3源代碼進行了快速修復,而不是創建自己的解決方案。你將不得不測試它,只有真正的改變是你在使用S3GetObjectRequest的位置,你將使用LargeFileS3GetObjectRequest。對我來說,它總共下載了4GB的數據,文件從1MB到700MB(在iPod touch 4g上測試)。 –
謝謝,當我回到我的項目中的這一點時,我會給它一個鏡頭。應該在一天左右。如果遇到問題,我一定要問你。再次感謝。 – user1086377