Rendre synchrone une traitement asynchrone

Bonjour,


 


J'ai une webview qui effectue des traitements (génération de SVG) avec une bibliothèque javascripte qui fonctionne de façon asynchrone.


 


Mon application (objective-c) a besoin que cette génération se fasse de façon synchrone.


 


Mon processus est le suivant:


  • Je charge la page dans ma webview
  • Dans le didFinishLoadForFrame, je charge le javascript et lance la génération de mon SVG (qui est aussi asysnchrone)

Comment encapsuler tout cela dans une méthode qui serait synchrone et qui attendrait à  la fois que la frame soit chargée et que la génération du SVG soit terminée?


 


Merci pour votre aide! :)


Réponses

  • Joanna CarterJoanna Carter Membre, Modérateur
    novembre 2016 modifié #2

    Donc, tu veux que ton utilisateur doive attendre ton traitement sans pouvoir utiliser l'appli ? ???  :o


  • Oui c'est cela, enfin le traitement prend 10 millisecondes au maximum :)


  • Joanna CarterJoanna Carter Membre, Modérateur
    novembre 2016 modifié #4

    Si le retard est vraiment court, pourquoi tu t'inquiète ?


  • J'ai un processus de transformation qui fait un certain nombre d'appels successifs à  cette fonction de génération de SVG. Le gérer en asychrone est un une prise de tête pour réconcilier les morceaux générés et les mettre à  l'endroit qui en a besoin. Si je les récupère de façon sycnhrone, au fur et à  mesure, c'est beaucoup plus simple.


  • Bonjour,


    si tu utilises WKWebView tu peux envoyer une notification depuis javascript (ici un article trouvé au pif sur le net pour expliquer un peu comment cela fonctionne). Il faut par contre que dans ton code tu attente la notification, avec un dispatch_semaphore_wait ou une boucle.


    Si tu utilises une WebView, il est possible d'utiliser le protocole WebScripting pour arriver à  peut prés au même résultat (ici un post SO avec une exemple tout simple). Ici l'idée serait de donner "accès" à  l'environnement JS une méthode Objective C (ou Swift) qui permet d'indiquer la fin du traitement par exemple. Il faut de toute façon ici aussi une boucle d'attente.


     


    Enfin plutôt que de mettre une boucle d'attente, un simple flag "opération terminée" qui sera renseigné depuis les méthodes cité au-dessus suffit.


     


    Ou alors peut être plus simple: un appel à  evaluateJavaScript:completionHandler: pour une WKWebView ou stringByEvaluatingJavaScriptFromString: pour une WebView qui testerai un flag dans l'environnement JS pour indiquer si le travail est terminé. Ainsi avant toute action de l'utilisateur dans ton application tu peux évaluer ce flag et autorisé ou non l'action. Bon en même temps avec un temps de traitement à  10ms je ne penses pas qu'un utilisateur aura le temps de faire quoi que ce soit..


  • Merci pour toutes ces pistes. Je pars à  leur exploration!


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