AFURLSessionManager : le downloadTask créé est Null

Bonjour à  tous.


 


J'ai un gros problème avec NSURLSession gerer dans AFURLSessionManager : régulièrement (quasiment un quart des téléchagement) le NSURLSessionDownloadTask créer est null :


 


- (NSURLSessionDownloadTask *)downloadTaskWithRequest:(NSURLRequest *)request
                                             progress:(NSProgress * __autoreleasing *)progress
                                          destination:(NSURL * (^)(NSURL *targetPath, NSURLResponse *response))destination
                                    completionHandler:(void (^)(NSURLResponse *response, NSURL *filePath, NSError *error))completionHandler
{
    __block NSURLSessionDownloadTask *downloadTask = nil;
    dispatch_sync(url_session_manager_creation_queue(), ^{
        downloadTask = [self.session downloadTaskWithRequest:request];
    });

    [self addDelegateForDownloadTask:downloadTask progress:progress destination:destination completionHandler:completionHandler];

    return downloadTask;
}

 


C'est à  dire que la ligne [self.session downloadTaskWithRequest:request]; me retourne nill.


Forcement ensuite ça plante.


 


Rien ne me permet de distingué une requête qui plante d'une autre, surtout que les trois quart fonctionnent.


 


Merci


 


D.H


Réponses

  • bah en fait ton block s'execute à  part je pense (si je ne dis pas de bêtise) et donc ton return peut s'executer avant. Donc je ne sais pas si c'est correcte de bouger tes deux dernière ligne dans le dispatch.


  • AliGatorAliGator Membre, Modérateur
    Il fait un dispatch_sync, pas un dispatch_async. Donc c'est synchrone, pas asynchrone. Donc le code va attendre que le dispatch_sync finisse de s'exécuter avant de continuer jusqu'au return. Ce n'est pas le souci.
  • ah j'ai mal lu ... 


  • samirsamir Membre
    septembre 2014 modifié #5

    Hello,


     


    C'est déficille de voir un bug dans ce bout de code puisque il vient d'une librairie bien testée et utilisée partout.


    Poste plutôt  une issue sur github. Les développeurs sont assez réactifs sur  AFNetworking.


  • A priori, l'équipe de AFNetworking serai déjà  au courant de ce bug :


    https://github.com/AFNetworking/AFNetworking/issues/1675


     


    Ce serai un bug Apple  : https://devforums.apple.com/message/926113#926113


     


    Du coup, dans AFURLSessionManager, je test le task et retourne nil pour que l'app puisse relancer la requête (max 3 essaie).


    C'est bof, mais j'ai pas mieux...


  • AliGatorAliGator Membre, Modérateur
    Bon à  savoir, merci pour le retour
  • Ma correction ne fonctionne pas : une fois que le task créer est nil, plus aucun task ne se créer et tous retourne nil !


     


    Du coup, je suis bloqué et au bout d'une dizaine de téléchargement en background, plus rien ne se télécharge...


     


    J'ai trouvé une autre solution : lorsque le task créé est nil, je supprime la session (en supprimant le AFURLSessionManager courant) et en récréé un nouveau.


     


    Les premiers test ont l'air concluant.

  • Autre solution qui permet de ne pas modifier AFNetworking, c'est de faire un try/catch :



    NSProgress *progress = nil;

    @try {
    self.currentTask = [self.backgroundSessionManager downloadTaskWithRequest:mutableRequest
    progress:&progress
    destination:^NSURL *(NSURL *targetPath, NSURLResponse *response)
    {
    return [NSURL fileURLWithPath:self.temporyFilePath];
    }
    completionHandler:^(NSURLResponse *response, NSURL *filePath, NSError *error)
    {
    IMLog(IMLoggerDebug, @completionHandler finish self :%@", self);
    if (error) {
    IMLog(IMLoggerError, @downloadTask error : %@", error);
    self.failedRequestAFNetworking(self, error);
    }
    else {
    self.finishedRequestAFNetworking(self, response);
    }
    [self.backgroundSessionManager invalidateSessionCancelingTasks:NO];
    }];
    }
    @catch (NSException *exception) {
    //if (self.currentTask == nil) {
    //}
    if ([exception.name isEqualToString:NSInternalInconsistencyException])
    {
    //Gestion d'un bug iOS : il arrive que NSURLSession ne créer plus de task et retroune nil
    //Si c'est le cas, reset de la session + fail
    [self.backgroundSessionManager invalidateSessionCancelingTasks:NO];
    [self resetBackgroundSessionManager];
    self.failedRequestAFNetworking(self, nil);
    }
    }
    @finally {

    }

    ça fonctionne bien par contre, je consielle de conté le nombre de fail histoire de ne pas faire une boucle infinie si jamais une autre erreur provoque cette exception à  tous les appels.


     


    D.H.


Connectez-vous ou Inscrivez-vous pour répondre.