Ios 使用AFN网络下载速度非常慢
下面的代码用于下载由压缩JSON或压缩jpg图像组成的数据“包”。问题是图像压缩文件下载。所讨论的文件是5MB,在64GB的iPhone7上下载大约需要10分钟,在相当慷慨的iMac上运行的模拟器上下载大约需要5分钟 接收到的数据会被存储,但在下载所有文件之前不会被处理,因此在下载完成之前,其他地方不会发生任何事情 这似乎太过分了,因为我可以使用web浏览器在可忽略不计的时间内下载文件。我看了各种各样的问题和答案,没有发现任何有用的东西 任何帮助都将不胜感激Ios 使用AFN网络下载速度非常慢,ios,objective-c,afnetworking-3,Ios,Objective C,Afnetworking 3,下面的代码用于下载由压缩JSON或压缩jpg图像组成的数据“包”。问题是图像压缩文件下载。所讨论的文件是5MB,在64GB的iPhone7上下载大约需要10分钟,在相当慷慨的iMac上运行的模拟器上下载大约需要5分钟 接收到的数据会被存储,但在下载所有文件之前不会被处理,因此在下载完成之前,其他地方不会发生任何事情 这似乎太过分了,因为我可以使用web浏览器在可忽略不计的时间内下载文件。我看了各种各样的问题和答案,没有发现任何有用的东西 任何帮助都将不胜感激 -(NSInteger)getPac
-(NSInteger)getPackageData:(NSString *)url type:(NSInteger)isZip fileName:(NSString *)fileName
item:(NSString *)item
{
__block NSInteger errorCode=0;
isReady=0;
NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
AFURLSessionManager *manager = [[AFURLSessionManager alloc] initWithSessionConfiguration:configuration];
if(isZip==0){
manager.responseSerializer=[AFJSONResponseSerializer serializer];
}else{
manager.responseSerializer=[AFHTTPResponseSerializer serializer];
}
AFSecurityPolicy *policy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModePublicKey];
[policy setValidatesDomainName:YES];
manager.securityPolicy = policy;
/****************
for self signed certs
manager.securityPolicy.allowInvalidCertificates = YES;
manager.securityPolicy.validatesDomainName = NO;
***************/
NSURL *mURL = [NSURL URLWithString:url];
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:mURL];
[request setCachePolicy: NSURLRequestReloadIgnoringLocalCacheData];
[request setTimeoutInterval:100];
NSURLSessionDataTask *dataTask =
[manager dataTaskWithRequest:request
completionHandler:^(NSURLResponse *response,
id json,
NSError *error) {
if (error) {
if ([response isKindOfClass:[NSHTTPURLResponse class]]) {
//error condition 1
NSInteger statusCode = [(NSHTTPURLResponse *) response statusCode];
if(statusCode==403){ // unauthorized
errorCode=-1;
}
}
}
else if(isZip==1){
// process Zipped json Files for data update
NSString *filePath = [jsonPath stringByAppendingPathComponent:fileName];
[json writeToFile:filePath options:NSDataWritingAtomic error:&error];
[[NSNotificationCenter defaultCenter] postNotificationName:@"dataReady" object:item];
errorCode=0;
}else if(isZip==2){ //zipped photos file
NSString *filePath = [photoPath stringByAppendingPathComponent:fileName];
CS_LOG(@"Saving URL %@ to photo file %@",url,filePath);
[json writeToFile:filePath options:NSDataWritingAtomic error:&error];
CLS_LOG(@"Saved");
[[NSNotificationCenter defaultCenter] postNotificationName:@"dataReady" object:@"PHOTOSREADY"];
errorCode=0;
}
} ];
[dataTask resume];
return errorCode;
}
一般来说,
NSURLSessionDataTask
用于在内存中处理少量数据,而NSURLSessionDownloadTask
用于下载大量数据(如zip文件)并将其存储在磁盘上
也许你应该用
NSURLSessionDownloadTask
来处理你的大拉链,用NSURLSessionDataTask
来处理你的JSON数据。可能帮不了你,但我要做的第一件事是用“基本”下载任务代码替换你的函数。看看它的速度有多快。如果速度更快,开始重新添加上面的其他功能,直到你遇到了让事情变慢的东西。@DonMag谢谢-我将重写这篇文章,看看会发生什么。顺便说一下,我很难想出一个更简单的实现。嗯。。。你可能有一个合理的理由,但是。。。通常,NSURLSessionDataTask用于处理少量数据,然后在内存中进行操作,而NSURLSessionDownloadTask用于下载大量数据(如zip文件)并将其存储在磁盘上。也许你应该用DownloadTask来处理你的大拉链,用DataTask来处理你的JSON数据。@DonMag我没有逻辑上的理由!;-)。我可以改变,谢谢@DonMag帮了大忙。如果你能把它变成一个答案,我会接受的。