NSURLDownload et delegate

Bonjour,



j'aurai une petite question de compréhension liée à  un problème que je rencontre avec l'utilisation de NSURLDownload et NSThread. J'ai peur de ne pas bien comprendre la phrase de la documentation NSURLDownload initWithRequest :


"Delegate messages will be sent on the thread which calls this method. For the download to work correctly the calling thread's run loop must be operating in the default run loop mode."



Je ne comprends pas cette phrase vu que pour moi dans un thread, tu a accès à  toutes les instances de tout les trends du programme.(ou bien?)



Je pense que l'erreur dans mon programme vient de la non compréhension de cette phrase, j'explique :



J'ai mon thread principal, qui appelle un autre thread. Dans ce deuxième thread, j'appelle NSURLDownload initWithRequest. Cependant, je n'ai pas les messages delegate. Ils s'apparaissent seulement si j'appelle NURLDownload dans le thread principale.



Il faut savoir que l'appel à  NSURLDownload initWithrequest est dans une instance de classe initialisée dans le thread principal.



Pour plus d'informations : https://github.com/YaGeek/iSpoiler



Ma classe NetworkManager gère les connexions.

Réponses

  • essaye au démarrage de ton thread secondaire : [[NSRunloop currentRunLoop] run];



    Maintenant, il faut m'expliquer l'utilité des threads pour un processus asynchrone comme NSURLDownLoad !
  • Je n'ai pas trouvé ta déclaration de NSThread dans ton code, NetworkManager étant un NSObject...



    Les trucs à  savoir pour les process asynchrone en NSThread / NSOperation :
    • NSThread / NSOperation est fait pour se détruire après la fin de la méthode principal (main, start ou encore la méthode que tu as précisé si c'est un constructeur de convenance)
    • Si tu veux utiliser des systèmes asynchrone dans un NSThread / NSOperation tu es obliger de faire une boucle while dans ta méthode pour checker quand ton travail asynchrone a fini puis rendre la main.


    Si tu lance un travail asynchrone dans un thread sans bloquer la fin d'exécution de la méthode principale ton thread sera détruit avant que tu ne récupère quoi que ce soit.



    Mais comme l'a dit mpergand, pourquoi un thread vu que tu es déjà  sur de l'asynchrone ?
  • yageekyageek Membre
    janvier 2012 modifié #4
    En ce qui concerne le threading, en gros j'ai le thread principale pour la GUI et un thread lancé qui gère tout ce qui concerne les téléchargement, parsing XML afin de ne pas gelé mon interface graphique. Et c'est dans ce thread que j'ai besoin de :
    1. Parser un fichier XML
    2. Télécharger ( je le fais de manière asynchrone) une page web
    3. Chercher des liens d'image précis dans cette page
    4. Télécharger ces mêmes images


    Pour ce qui concerne le point 4 j'utilise cette fameuse classe, mais je ne comprenais pas pourquoi je n'arrive pas à  récupérer les messages envoyé normalement au delegate. Seulement, je début sous Cocoa et je ne sais pas si c'est la bonne manière de faire. Comment fait on proprement ?





    Mais quelqu'un peut il m'expliquer cette phrase ?



    Merci pour les réponses en tout cas :-)



    EDIT : Nan mais je vais essayer de tout passer en asynchrone, je pense que ça sera plus propre. Mais je reste curieux sur la phrase de la documentation.
  • 'YaGeek' a écrit:
    Pour ce qui concerne le point 4 j'utilise cette fameuse classe, mais je ne comprenais pas pourquoi je n'arrive pas à  récupérer les messages envoyé normalement au delegate. Seulement, je début sous Cocoa et je ne sais pas si c'est la bonne manière de faire. Comment fait on proprement ?





    Mais quelqu'un peut il m'expliquer cette phrase ?




    Je t'ai répondu plus haut, ton thread secondaire fini avant l'appel des méthodes du delegate. Tu dois le bloquer jusqu'à  récupérations de tous les delegates.



    L'approche asynchrone en thread n'est pas la bonne.
  • Ahhhhhh OK ! Je suis un peu novice dans le cacao, je sais même pas lire entre les lignes. Du coup je suis tombé sur un [url="http://forum.cocoacafe.fr/index.php?/topic/6580-ohurlloader-utiliser-les-blocks-pour-charger-des-urls/page__hl__+requête++asynchrone__fromsearch__1"]post plutôt cool [/url]sur ce forum (très cool lui aussi) et j'ai essayé de comprendre comme l'astuce fonctionnait. Et je suis tombé sur quelque chose que je n'avais pas encore rencontré : initialiser un objet en argument d'une fonction :


    [loader startRequestWithCompletion:^(NSData* receivedData, NSInteger httpStatusCode) { ...}
    






    La déclaration correspondante :
    <br />
    -(void)startRequestWithCompletion:(void (^)(NSData* receivedData,NSInteger httpStatusCode))completionHandler<br />
    	  errorHandler:(void (^)(NSError* error))errorHandler;<br />
    




    Et du coup j'ai commencé à  chercher le ^(..) {...} et void (^) sous google et je n'ai rien trouvé image/sad.png' class='bbc_emoticon' alt=':(' />

    Comment ça s'appelle et savez vous où je pourrais trouver de l'information dessus ?
  • CéroceCéroce Membre, Modérateur
    ça s'appelle des blocs, et trouve ça dans la doc Blocks Programming Topics.

    Il y a aussi une vidéo de la WWDC sur le sujet, qui couvre l'essentiel. Encore faut-il comprendre l'anglais parlé.
  • Merci, je file me documenter :-p
  • Pour te documenter, tu peux aussi regarder la vidéo des CocoaHeads de Rennes dans laquelle les Blocks sont présentés, ainsi que GCD qui permet de gérer l'asynchronisme de manière puissante et simple:

    http://cocoaheads.fr/2011/05/slides-de-la-session-davril-a-rennes/
Connectez-vous ou Inscrivez-vous pour répondre.