2012-02-23 10 views
0

我正在开发一款应用程序,用于下载资源并将它们写入磁盘供以后脱机使用,并且它始终是自定义内容。目前我们正在处理大约4000张JPG的内容。用户初始化内容到iPad上的下载,并且在用户界面中有一个进度条,所以用户基本上一直等到它完成。问题在于大约分配了180 - 190 MB的内存,它崩溃了。如何处理几千个NSURLConnection请求,下载图像并保持内存使用率下降

我在仪器看到那是什么CFData(店)是主要的罪魁祸首,我的理解是,CFData(店)是NSURLConnection的请求缓存。

我已经试过:

NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0 diskCapacity:0 diskPath:nil]; 
[NSURLCache setSharedURLCache:sharedCache]; 
[sharedCache release]; 

[[NSURLCache sharedURLCache] removeAllCachedResponses]; 

以及设置缓存政策,没有任何改善。

以供参考,这是我的POST请求的样子:

NSMutableURLRequest *request = [[[NSMutableURLRequest alloc] init] autorelease]; 
[request setCachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData]; 
[request setURL:[NSURL URLWithString:urlString]]; 
[request setHTTPMethod:@"POST"]; 

NSString *contentType = [NSString stringWithFormat:@"text/xml"]; 
[request addValue:contentType forHTTPHeaderField: @"Content-Type"]; 

NSMutableData *postBody = [NSMutableData data]; 
[postBody appendData:[xmlMessage dataUsingEncoding:NSUTF8StringEncoding]]; 
[request setHTTPBody:postBody]; 

//get response 
NSHTTPURLResponse* urlResponse = nil; 
NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&urlResponse error:&httpError]; 

任何帮助将用热烈的掌声来满足。

+0

你使用辅助线程来做到这一点吗? – Jim 2012-02-23 17:44:24

+0

另外,你有一个大概的想法,你有多少MB预计下载?我想知道这与你给出的190 MB数字相比如何。 – Jim 2012-02-23 17:45:25

+0

@Jim不,不是辅助线程。在这些请求正在进行时,进度条正在主线程上更新。根据总大小,从查看我的模拟器中的文档文件夹,大约300 - 400 MB。 – SnareHanger 2012-02-23 18:12:54

回答

0

如果您确实想要对同步请求执行此操作,那么您可以考虑明确地重新提示并释放每个请求中使用的对象。使用autorelease池意味着来自每个请求的剩余碎片都在autorelease池中,直到池被耗尽。

如果您有一个处理这些请求的for循环或其他循环,您还可以在循环内创建一个更本地的autorelease池,然后在循环结束之前耗尽它。如果你这样做了,并且你有超出该循环范围(和池)的数据,你应该将它保留在循环中,并在稍后的某个时刻发布。

在某些时候,根据您的经验水平,您应该考虑在辅助线程中完成所有操作。您可以将每个提取视为一个自包含的操作,然后使用NSOperation和NSOperationQueue等来管理它。这样,您可以同时启动多个操作,并且在等待每个响应时不会阻塞您的线程。

+0

所以我们的HttpRequest对象被初始化为实际发出请求调用的循环外部的'autorelease'。游泳池正在被释放几个级别。 我移动了for循环中的HTTPRequest对象初始化,并专门为循环添加了一个AutoReleasePool。到目前为止,CFData(商店)没有超过12 MB,并且通常约为8 MB。下载量的45%。似乎是正确的做法。 至于NSOperationQueue,那简单程度是什么? – SnareHanger 2012-02-23 21:07:27

+0

在网页上覆盖NSOperation和NSOperationQueue,但我从未在一个地方找到我需要的所有东西。首先Google搜索Ray Wenderlich GCD,并看看他的例子。一旦你意识到与iOS环境中的线程和操作相关的几个facotrs,它将看起来很简单。但是在这里可以告诉的不仅仅是这些。祝你好运。 – Jim 2012-02-23 22:47:59

+0

作为事实上,雷人的例子非常接近,你在做什么。一探究竟。 (出于某种原因,我无法将链接粘贴到我的iPad上。) – Jim 2012-02-23 22:49:07