Exécuter plusieurs fonctions avec des completion block successivement

Luc-ALuc-A Membre

Bonjour à tous !

Pour mon application Museum, j'aicréé un système qui permet d'enregistrer la liste des musées dans l'application directement, afin de permettre aux utilisateurs des soucis de 4G. Or, je souhaite mettre en place un système qui vérifiera s'il y a eu une mise à jour.
J'ai donc crée une fonction avec un completion block qui récupère une date dans mon API, et une autre fonction qui télécharge la liste des musées dans l'application.

Comment faire pour vérifier si une mise à jour est nécessaire avant de télécharger la liste des musées ? Je sais qu'on utilise des completion block pour récupérer les données d'une API par exemple, et que l'on peut exécuter des instructions après avoir récupérer les données, comme par exemple recharger la page.

Je vous remercie pour votre aide.

Mots clés:

Réponses

  • LarmeLarme Membre
    mai 2018 modifié #2

    Tu peux imbriquer les appels.
    Je ne sais plus si tu préfères du Swift ou de l'Objective-C, mais voici ce que je ferais en pseudo code:

    function checkIfDataBaseIsUpToDate(withCompletionHandler:handler)
    {
        checkDataAPI { 
            handler(yesOrNoOrError) 
        }
    }
    
    function updateDatabase(withCompletionHander:handler) {
        retrieveDB {
            handler(didRetrieveWithSuccessAndSavedLocally)
        }
    }
    
    function updateDatabaseIfNeeded(withCompletionHander:handler) {
      checkIfDataBaseIsUpToDate {
          if (!error) {
           if(isUpToDate) {
              handler(sucess)
           }
          else {
              updateDatabase {
                  handler(success/no/error)
              }
          }
        }
    }
    
  • Luc-ALuc-A Membre

    Larme, je te remercie pour ton aide.
    Je préfère Swift. Je ne connais pas Objective-C.

    En fait, c'est un peu plus compliqué, et comme à mon habitude, j'ai cherché midi à quatorze heures...

    Mais je peux imbriquer les appels.

  • Bonjour Luc-A,

    J'ai l'impression que ce que tu décris ressemble au concept de 'promise'.
    Jette un coup d'œil si jamais tu ne connais pas:
    https://learnappmaking.com/promises-swift-how-to/

  • Luc-ALuc-A Membre

    Bonjour Mayerick !

    Effectivement, je ne connaissais pas Promise.
    Malheureusement, je ne parviens pas à l'installer... J'ai installé CocoaPods, j'ai téléchargé le framework Promise 6.0, mais j'ai toujours une erreur lorsque je veux importer Promise.

    Du coup, et sans vouloir t'offenser, j'essaie d'utiliser DispatchGroup pour résoudre le problème. Cela fonctionne, mais pas correctement. D'un autre côté, ce n'est pas forcément ce que je recherche.

    http://jordansmith.io/dispatch-groups-in-swift-3/

    Mais je n'obtiens pas le résultat que je désire...

  • Luc-ALuc-A Membre

    J'ai peut-être réussi. Je teste encore, et je vous tiens au courant.

  • LarmeLarme Membre

    DispatchGroup, c'est pour "attendre la fin de plusieurs appels asynchrones" en général.
    Cela me semble pas être la meilleure solution à utiliser.

    La méthode que j'ai cité précédemment, je l'ai utilisé pour renouveler un Token (qui s'expire potentiellement toutes les heures) et nécessaire à la plupart de nos appels web.

  • Luc-ALuc-A Membre

    Larme, je te remercie pour tes explications.
    C'est un peu plus compliqué que ce que j'ai décrit au départ. J'ai en réalité 3 requêtes asynchrones : une pour les départements, une pour les pays (oui j'ai prévu très grand, immense même) et une pour les musées.

    Cela dit, je devrais peut-être faire un mix : utiliser ta méthode pour vérifier s'il y a besoin d'une mise à jour, et charger les données selon le cas. Je verrai ça demain à tête reposée.

  • Bonjour Luc-A,

    Pas de problème, et non ça ne me vexe pas du tout. :) C'est dommage car ça semble répondre exactement au besoin. Tu as déjà utilisé cocoaPod avant ?
    Bon l'essentiel est que tu ai trouvé un outil qui réponde à ton besoin, après lequel exactement ce n'est pas bien important !

  • Luc-ALuc-A Membre

    Bonjour Mayerick !

    J'avais déjà utilisé cocoaPods avant oui, et je sais comment l'installer. Certes, il faut passer par le terminal, et je ne connais pas les commandes par coeur, mais j'ai suivi un tutoriel et j'ai réussi à installer cocoaPods.
    J'ai aussi réussi à installer Promise.
    Cependant, je n'ai pas réussi à l'importer dans mon projet. J'ai recherché sur Internet, et j'ai vu que certaines personnes ont eu le même souci que moi, mais je n'ai pas réussi à trouver la solution. Le problème et que mon niveau d'anglais est mauvais, et donc, j'ai du mal à comprendre les explications.

    Oui, j'ai trouvé une solution, et il n'y a plus de bug ! Cela dit, je conserve ton idée, et je réessaierai dès que j'en aurai l'occasion !

    Je te remercie pour ton aide !

  • Sans prétentions, étant sur un tuto en ce moment, ça fonctionne ou pas ?
    Sinon je peux tenter de t'aider ? sans la moindre garantie...

  • Bonsoir Gercofis !

    Je te remercie de me proposer ton aide !
    Oui, ça fonctionne. En fait, j'ai utilisé DispatchQueue.global.
    Certes, comme le dis Larme, ce n'est pas la meilleure solution, mais ça fonctionne.
    Et puis, j'ai essayé de faire autrement, c'est-à-dire en utilisant DispatchQueue.global uniquement avec les fonctions qui vont chercher les données sur le serveur, sauf que là, ça fonctionne une fois sur deux. Du coup, j'ai tout imbriquer dans DispatchQueue.global. Et là, tout fonctionne correctement !

    Pour la solution proposée par Mayerick, je n'ai pas réessayé, mais je le ferai dès que j'aurai un moment. Apparemment, il me manquait juste un fichier... Il a dû y avoir un souci au niveau du téléchargement...

    Merci encore Gercofis !

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