使用 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