Cocoa touch NSURLConnection+;用于文件下载的NSMutableData非常慢

Cocoa touch NSURLConnection+;用于文件下载的NSMutableData非常慢,cocoa-touch,ipad,nsurlconnection,Cocoa Touch,Ipad,Nsurlconnection,基本上,我需要在我的应用程序中下载一大堆文件,我设置了一个排序队列,通过NSURLConnection下载每个文件,并将服务器响应增量存储在NSMutableData中,直到下载完成,然后将整件事写入磁盘 以下是相关部分: - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)_response { response = [_response retain]; if

基本上,我需要在我的应用程序中下载一大堆文件,我设置了一个排序队列,通过NSURLConnection下载每个文件,并将服务器响应增量存储在NSMutableData中,直到下载完成,然后将整件事写入磁盘

以下是相关部分:

- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)_response {
    response = [_response retain];
    if([response expectedContentLength] < 1) {
        data = [[NSMutableData alloc] init];
    }
    else {
        data = [[NSMutableData dataWithCapacity:[response expectedContentLength]] retain];
    }
}

- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)_data {
    [data appendData:_data];
}

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    NSLog(@"saved: %@", self.savePath);
    [data writeToFile:self.savePath atomically:YES];
}

当然,我实际上没有硬编码的url,request和conn都是downloader类的实例变量。这并不重要,但我使用的是JSON。选项和服务都是方法参数(NSString和NSDictionary),它们也不重要。

我想通过分析找出减速发生的位置和模式。在
connection:didReceiveData
中放置一条log语句,以查看调用它的频率。您正在寻找:

  • 调用方法之间的相对运行时间
  • 通话间隔时间是否随着应用程序的运行而增加 如果调用之间的时间间隔是应用程序花费大部分时间的地方,那么瓶颈就在请求本身。请求配置错误或服务器未快速发送

    如果应用程序运行的时间越长,通话间隔就越长,那么可能是内存问题。随着数据越来越大,内存也越来越有限,应用程序必须在内存中交换更多的内容,这会减慢速度。要进行测试,请在任何活动对象中记录各种
    didReceiveMemoryWarning
    方法


    更新:
    根据Shark的说法,问题在于你的URL请求,而不是你发布的代码。您需要了解如何设置请求

    孩子,这太尴尬了。事实证明,我的内容长度头不准确,这导致NSURLConnection需要等待某种超时才能完成,即使它拥有所有数据。这很有道理。这可能会帮助其他人解决问题。

    默认情况下,内存警告不是全局记录的吗?我没有记录连接之间的时间间隔:didReceiveData,但我跟踪了我的apache日志,每个请求之间的时间是统一的,每次下载的总内存使用量从未超过几兆字节,每个downloader对象在完成后都会被正确释放。我还用Shark做了一个时间配置文件,大部分时间都花在urlconnection相关的系统调用上。在这种情况下,服务器不是问题所在,已经分别进行了测试。将来,如果您从Shark等工具获得信息并控制服务器,您应该在原始问题中包含该信息。否则,我们将假定您没有该信息和/或不知道如何获取该信息。我使用用于设置请求的代码更新了我的问题。谢谢你给我的建议。
    NSMutableURLRequest *request = [[NSMutableURLRequest requestWithURL:[NSURL URLWithString:[@"http://xxx.xxx.xxx.xxx/index.php?service=" stringByAppendingString:service]]] retain];
    
    [request setHTTPMethod:@"POST"];
    [request setHTTPBody:[[options JSONRepresentation] dataUsingEncoding:NSUTF8StringEncoding]];
    
    NSURLConnection *conn = [NSURLConnection connectionWithRequest:request delegate:self];
    [conn start];