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