Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/115.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何处理数千个NSURLConnection请求、下载图像并降低内存使用率_Objective C_Ios_Nsurlconnection_Nsurlcache - Fatal编程技术网

Objective c 如何处理数千个NSURLConnection请求、下载图像并降低内存使用率

Objective c 如何处理数千个NSURLConnection请求、下载图像并降低内存使用率,objective-c,ios,nsurlconnection,nsurlcache,Objective C,Ios,Nsurlconnection,Nsurlcache,我正在开发一个应用程序,它可以下载资源并将其写入磁盘供以后脱机使用,而且它始终是自定义内容。目前,我们正在处理大约有4000个JPG的内容。用户初始化内容下载到iPad上,UI中有一个进度条,因此用户基本上会等到下载完成。问题是,大约180-190 MB的内存分配,它崩溃 我在Instruments中看到的是,CFData(store)是罪魁祸首,我的理解是CFData(store)是NSURLConnection请求的缓存 我试过: NSURLCache *sharedCache = [[NS

我正在开发一个应用程序,它可以下载资源并将其写入磁盘供以后脱机使用,而且它始终是自定义内容。目前,我们正在处理大约有4000个JPG的内容。用户初始化内容下载到iPad上,UI中有一个进度条,因此用户基本上会等到下载完成。问题是,大约180-190 MB的内存分配,它崩溃

我在Instruments中看到的是,CFData(store)是罪魁祸首,我的理解是CFData(store)是NSURLConnection请求的缓存

我试过:

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

以及设置缓存策略,没有任何改进

作为参考,以下是我的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];

任何帮助都会受到热烈的掌声。

如果你真的想用同步请求来实现这一点,那么你可以考虑明确地重新发布和释放每个请求中使用的对象。使用自动释放池意味着来自每个请求的剩余碎屑都位于自动释放池中,直到池被排空

如果您有一个for循环或其他一些循环来处理这些请求,那么您还可以在循环内创建一个更本地的自动释放池,然后在循环结束之前将其耗尽。如果您这样做了,并且您希望保留的数据超出了该循环(和池)的范围,那么您应该将其保留在循环中,并在稍后的某个时间将其重新释放


在某一点上,取决于你的经验水平,你应该考虑在二次线程上完成这一切。您可以将每个获取视为一个自包含的操作,然后使用NSOperation和NSOperationQueue之类的工具来管理它。这样,您就可以同时启动多个操作,而不会在等待每个响应时阻塞线程

您是否使用辅助线程来执行此操作?另外,您是否大致知道您希望下载的总MB数?我想知道这与您给出的190MB数字相比如何。@Jim不,不是次要线程。在处理这些请求时,主线程上的进度条正在更新。就总大小而言,从我的模拟器中的documents文件夹来看,大约有300-400 MB。因此,我们的HttpRequest对象在实际发出请求调用的循环之外被初始化一次为
autorelease
。游泳池的水位上升了几层。我将HTTPRequest对象初始化移到for循环中,并专门为该循环添加了一个AutoReleasePool。到目前为止,CFData(存储)还没有超过12MB,它通常保持在8MB左右。我有45%的下载量。这似乎是正确的方法。至于NSOperationQueue,它的简单程度是什么?在web上有很多关于NSOperation和NSOperationQueue的内容,但我从来没有在一个地方找到我需要的所有东西。从谷歌搜索Ray Wenderlich GCD开始,看看他的例子。一旦您了解到与iOS环境中的线程和操作相关的多个facotr,它将看起来很简单。但这里有很多东西。祝你好运。事实上,雷的例子非常接近你所做的。过来看。(由于某些原因,我无法将链接粘贴到我的iPad上。)
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];