使用AFNetworking的下载速度非常慢

时间:2017-03-07 17:13:38

标签: ios objective-c afnetworking-3

以下代码用于下载由压缩JSON或压缩jpg图像组成的数据“包”。问题是图像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;

}

1 个答案:

答案 0 :(得分:2)

通常,NSURLSessionDataTask用于小数据,然后在内存中进行操作,而NSURLSessionDownloadTask用于下载大量数据(如zip文件)并将其存储在磁盘。

也许你应该使用NSURLSessionDownloadTask作为你的大拉链,NSURLSessionDataTask作为你的JSON数据。