NSURLSessionDownloadTask (Migration iOS 7 vers iOS 8)

Bonjour à  tous !


 


J'imagine qu'on parle beaucoup de migration vers iOS 8 en ce moment ??? :)


 


J'ai un système de téléchargement de fichiers volumineux ~200 Mo pièce avec NSURLSession / NSURLSessionTask et bien sûr NSURLSessionDownloadTask.


 


Sous iOS 7, le téléchargement via un objet NSURLSessionDownloadTask fonctionnait parfaitement bien. Sous iOS 8 c'est pareil sauf que... la mémoire n'est pas libérée au cours du téléchargement. Autrement dit, les blocs téléchargés ne doivent plus être libérés. Sur un iPad 2 (512 Mo de RAM) c'est mort, je plante mon application.


 


Impossible de trouver des informations là  dessus sur le net...


 


Je suis en train d'explorer plutôt du côté de la configuration NSURLSessionConfiguration pour voir si des choses n'ont pas évoluées de ce côté là .


 


Si certains d'entre vous ont des infos ou des idées, par avance merci de votre avis.


 


Je continue mes recherches et je mettrai le sujet à  jour.


 


Bonne soirée à  tous.


 


NasH


 


 


 


 


Réponses

  • Am_MeAm_Me Membre
    septembre 2014 modifié #2

    Test sur Simulateur ou iPhone.


    Car le simulateur a des bugs de tps à  autres de connexion http ...


     


    Ah j'avais pas vu.


    As-tu tenté de repasser par NSUrlConnection ?


  • NasH5169NasH5169 Membre
    septembre 2014 modifié #3

    Simulateur ou Device, la montée en RAM est identique. Je n'ai par contre pas tenté de simplifier mon "process" en utilisant une simple NSUrlConnection. Je vais regarder ce côté.


     


    Edit : Y'a une gestion pour gérer une barre d'avancement du download sur le NSUrlConnection ? Désolé suis pas très au point là  dessus.


  • Hello,


     


    Je ne pense pas que ça vient des classes NSURLSession/...  parce que ç aurait généré une discussion sur le net tellement c'est gênant et la majorité des application utilisent ces classes, mais ça n'exclut aucune éventualité :).


     


    Si tu montre le code qui télécharge les données et comment tu traites ces données après ,peut être que ça vient de ton code.



  • NasH5169

     


    Je parlais du simulateur.


  • Mon UIViewController utilise les delegate suivantes : NSURLSessionDelegate, NSURLSessionTaskDelegate, NSURLSessionDownloadDelegate


     


     


    Dans le viewDidLoad



    // Initialisation du session manager
    NSURLSessionConfiguration *configuration = [NSURLSessionConfiguration defaultSessionConfiguration];
    configuration.allowsCellularAccess = YES;
    self.session = [NSURLSession sessionWithConfiguration:configuration delegate:self delegateQueue:nil];


    Sur un bouton, je lance la tâche



    NSURLRequest *request = [NSURLRequest requestWithURL:url];
    self.downloadTask = [self.session downloadTaskWithRequest:request];
    [self.downloadTask resume];

    Delegate pour passer le credential à  la requête




    - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didReceiveChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler
    {
        if (challenge.previousFailureCount > 3)
            [task cancel];
        
        NSURLCredential *credential = [NSURLCredential credentialWithUser:@username password:@password persistence:NSURLCredentialPersistenceNone];
        completionHandler(NSURLSessionAuthChallengeUseCredential, credential);
    }


    Delegate quand c'est fini (NSURLSessionTask)



    - (void)URLSession:(NSURLSession *)session task:(NSURLSessionTask *)task didCompleteWithError:(NSError *)error
    {
       
    }



    Delegate quand c'est fini (NSURLSessionDownloadTask)



    - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didFinishDownloadingToURL:(NSURL *)downloadURL
    {
        
    }


    Delegate lors du téléchargement d'un bloc pour faire une barre d'avancement



    - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask
          didWriteData:(int64_t)bytesWritten totalBytesWritten:(int64_t)totalBytesWritten totalBytesExpectedToWrite:(int64_t)totalBytesExpectedToWrite
    {
            float totalKoToDL = totalBytesExpectedToWrite / 1000.0;
            float totalKoAlreadyDL = totalBytesWritten / 1000.0;
            float progression = totalKoAlreadyDL / totalKoToDL;
            [[NSOperationQueue mainQueue] addOperationWithBlock:^{
                [self.productSelected.progress setProgress:progression];
                [self.productSelected.labelPercent setText:[NSString stringWithFormat:@%.1f%%, progression * 100]];
            }];
    }





    J'utilise pas cette delegate...



    - (void)URLSession:(NSURLSession *)session downloadTask:(NSURLSessionDownloadTask *)downloadTask didResumeAtOffset:(int64_t)fileOffset expectedTotalBytes:(int64_t)expectedTotalBytes
    {
        // Delegate function not used
    }

    C'est à  peut être tout. :-/



  • Petit information qui a son importance :


     


    - Même code


    - Même serveur de téléchargement


    - Mais restauration iOS 7.1.2 et compilation en iOS 7.1 (sur le projet)


     


    Pas de prise de mémoire...


     


    Je re-migre sous iOS 8 et je vais tester l'application compilée en iOS 7.1


  • Re-bonjour à  tous,


     


    J'ai fait une demande de support auprès d'Apple pour avoir plus d'informations, voici leur réponse :


     




    I'm responding to your report of memory problems with NSURLSessionDownloadTask on iOS 8.  You wrote:

     

    > Since the iOS 8 migration, with my project, NSURLSessionDownloadTask

    > don't release the taking memory, and it's nearly impossible to

    > complete and ~200 Mo file download on iPad 2.

     

    Strange.  I haven't heard any other reports of problems like this and, given how popular NSURLSessionDownloadTask is, I'd be surprised if there were a general problem here.

     

    I have two requests for you:

     

    o First things first, make sure you don't accidentally have zombies enabled.  The nature of zombies means that the app's memory use grows without bound.  I have, myself, spent hours looking for a memory leak that was just an artefact of leaving that debugging feature enabled )-:

     

    o Please find attached a small test program that uses an NSURLSessionDownloadTask to download a large (about 450 MiB) file.  Does this reproduce the problem in your environment?  I tested the program here and it was able to download large files without any problems, even on an iPad 2.

     

    Share and Enjoy

    --

    Quinn "The Eskimo!"                    <http://www.apple.com/developer/>

    Apple Developer Relations, Developer Technical Support, Core OS/Hardware

     



     



    J'ai testé le programme test qu'ils m'ont filé. J'ai le même souci de prise de mémoire lors du téléchargement et de non libération de la mémoire à  la fin.


     


    J'ai vérifié mes schemes pour voir si le debugging n'était pas actif pour ces fameux "zombies". Tout est désactivé rien du tout.


     


    Est-ce que quelqu'un pourrait faire tourner l'exemple URLSession et vérifier la prise ou pas de mémoire vive dans le simulator iPad 2 (xcode 6).


     


    http://www.praetorians-fs.com/divers/jardy_tempo/QTestbed.zip


     


    Merci votre aide.




  • Est-ce que quelqu'un pourrait faire tourner l'exemple URLSession et vérifier la prise ou pas de mémoire vive dans le simulator iPad 2 (xcode 6).


     


    http://www.praetorians-fs.com/divers/jardy_tempo/QTestbed.zip


     


    Merci votre aide.





    Bonsoir à  tous,


     


    Je me permets de relancer un peu notre sujet et de vous demander si l'un d'entre vous pourrez tester l'exemple fournit ? Ca nous serait d'une grande aide.


     


    Merci à  tous.

  • Suite à  un ticket support avec Apple, il s'avère que c'est un souci de xcode 6 et non de NSURLSession. C'est pourquoi le problème est "passé inaperçu". En gros sans rentrer dans les détails, xcode ne libère pas la RAM prise lors d'un téléchargement si il est en mode debug sur le simu ou avec la device connectée. Un bug a été ouvert sur le bug reporting d'Apple et sera corrigé dans une version ultérieure de xcode.


     


    :p  


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