Le bit de code ci-dessous est utilisé pour télécharger des «paquets» de données composés d'images JSON zippées ou zippées. Le problème est le téléchargement du fichier zip de l'image. Le fichier en question est de 5 Mo, et prend environ 10 minutes à télécharger sur un iphone 7 de 64 Go, et environ 5 minutes sur le simulateur fonctionnant sur un iMac généreusement provisionné. Les données reçues sont stockées, mais ne sont pas traitées tant que tous les fichiers n'ont pas été téléchargés. Il ne devrait donc rien se passer ailleurs tant que le téléchargement n'est pas terminé.Vitesse de téléchargement très lente avec AFNetworking
Cela semble assez excessif car je peux télécharger le fichier en utilisant un navigateur Web dans une période de temps négligeable. J'ai regardé diverses questions et réponses et n'ai rien trouvé d'utile.
Toute aide sera grandement appréciée.
-(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;
}
Peut ne pas vous aider, mais la première chose que je ferais est de remplacer votre fonction avec le code de tâche de téléchargement AFNetworking "de base". Voyez comment la vitesse est avec ça. Si c'est plus rapide, commencez à ajouter dans les autres fonctionnalités que vous avez ci-dessus, jusqu'à ce que vous frappiez quelque chose qui ralentit les choses. – DonMag
@DonMag Merci-je vais réécrire cette pièce et voir ce qui se passe. D'un autre côté, il m'est difficile de penser à une implémentation plus minime. – jmf1205
Hmmm ... vous pourriez avoir une raison logique pour cela, mais ... En général, NSURLSessionDataTask est utilisé pour de petits bits de données qui sont ensuite manipulés en mémoire, tandis que NSURLSessionDownloadTask est utilisé pour télécharger de grandes quantités de données (comme un fichier zip) et le stocker sur le disque. Peut-être devriez-vous utiliser DownloadTask pour vos gros zips, et DataTask pour vos données JSON. – DonMag