使用 AFNetworking 下载速度非常慢
Very slow download speed using AFNetworking
下面的代码位用于下载由压缩 JSON 或压缩 jpg 图像组成的数据 "packages"。问题是图像 zip 文件下载。有问题的文件是 5 MB,在 64GB iphone 7 上下载大约需要 10 分钟,在配置相当慷慨的 iMac 上的模拟器 运行 上下载大约需要 5 分钟。
存储接收到的数据,但在下载所有文件之前不会进行处理,因此在下载完成之前其他地方不应进行任何操作。
这似乎太过分了,因为我可以在微不足道的时间内使用网络浏览器下载文件。我查看了各种问题和答案,但没有发现任何有用的东西。
如有任何帮助,我们将不胜感激。
-(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
,为你的 JSON 数据使用 NSURLSessionDataTask
。
下面的代码位用于下载由压缩 JSON 或压缩 jpg 图像组成的数据 "packages"。问题是图像 zip 文件下载。有问题的文件是 5 MB,在 64GB iphone 7 上下载大约需要 10 分钟,在配置相当慷慨的 iMac 上的模拟器 运行 上下载大约需要 5 分钟。
存储接收到的数据,但在下载所有文件之前不会进行处理,因此在下载完成之前其他地方不应进行任何操作。
这似乎太过分了,因为我可以在微不足道的时间内使用网络浏览器下载文件。我查看了各种问题和答案,但没有发现任何有用的东西。
如有任何帮助,我们将不胜感激。
-(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
,为你的 JSON 数据使用 NSURLSessionDataTask
。