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

时间:2010-07-20 12:51:54

标签: cocoa-touch ipad nsurlconnection

基本上发生的事情是我需要在我的应用程序中下载一大堆文件,并且我已经设置了一个队列,使用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];
}

关于为什么这会非常缓慢的任何见解?使用模拟器非常糟糕,在实际设备上变得更糟。我的最大下载大小约为2兆字节,所以我认为将整个内容存储在内存中直到它完成并不是一个想法的坏。这最多可以达到大约20KB / s(使用直接的ad-hoc wifi连接)。

编辑:在我的所有测试用例中,我都获得了Content-Length标头,因此不需要在收到每个响应位的情况下增加NSMutableData。

编辑2:this是Sha​​rk给我的全部。

编辑3:这就是我设置连接的方式

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];

当然我实际上没有硬编码的url,而request和conn都是下载器类的实例变量。不是它应该重要,但对于JSON我正在使用http://code.google.com/p/json-framework/。选项和服务是方法参数(NSString和NSDictionary),而不是那些也应该重要。

2 个答案:

答案 0 :(得分:2)

答案 1 :(得分:0)

我想知道减速发生的位置和模式。在connection:didReceiveData中放置一个日志语句,以查看记录它的频率。你在寻找:

  1. 调用方法之间经过的相对时间。
  2. 应用程序运行时,通话之间的时间是否会增加。
  3. 如果通话之间经过的时间是应用程序花费大部分时间的时间,那么瓶颈就在请求本身中。请求配置错误,服务器没有快速发送。

    如果调用之间的时间间隔越长,应用程序运行的时间越长,则可能是内存问题。随着数据变得越来越大,内存越来越受限制,应用程序必须在内存中交换更多内容,从而减慢所有内容的速度。要进行测试,请记录任何活动对象中的各种didReciveMemoryWarning方法。


    更新

    根据Shark的说法,问题在于您的网址请求,而不是您发布的代码。您需要查看如何设置请求。