2017-03-07 1 views
1

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; 

} 
+0

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

+0

@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

+1

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

Répondre

2

En général, NSURLSessionDataTask est utilisé pour les petits bits de données qui sont ensuite manipulées dans la mémoire, alors que NSURLSessionDownloadTask est utilisé pour le téléchargement de grandes quantités de données (par exemple un fichier ZIP) et le stocker sur le disque.

Peut-être devriez-vous utiliser NSURLSessionDownloadTask pour vos gros zips, et NSURLSessionDataTask pour vos données JSON.