Cocoa touch NSURLConnection+;用于文件下载的NSMutableData非常慢
基本上,我需要在我的应用程序中下载一大堆文件,我设置了一个排序队列,通过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
- (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];