Exécuter plusieurs fonctions avec des completion block successivement

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
    10 mai 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.

  • MayerickMayerick Membre

    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.

  • MayerickMayerick Membre

    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 !

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