2017-09-07 3 views
0

J'utilise Alamofire et SVProgressHUD pour interroger une API et traiter les données. La question est qu'à l'intérieur de la file d'attente, même si je mets à jour l'interface utilisateur dans le thread principal, le résultat de la mise à jour viendra après la fin de la file d'attente. Ce que je veux faire est d'afficher un état de progression sur la barre de progression et de mettre à jour continuellement l'état de progression (float) dans une boucle. Cependant, ceci n'apparaîtra pas jusqu'à ce que toutes les choses dans la queue d'expédition soient faites. Mon code ressemble à ci-dessous. Impossible de mettre à jour l'interface utilisateur dans le thread principal dans une file d'attente de répartition. 3

Vive
DispatchQueue.global(qos: .userInitiated).async(execute: { 
     Alamofire.request(queryURL).responseJSON() { response in 
    //Do something 
    for i in 0..<100{ 
     //Do lots of things 
     DispatchQueue.main.async { 
      SVProgressHUD.showProgress(Float(i/100), status: "Loading...") 
     } 
    } 
//Dismiss 
}) 
+1

Je ne pense pas que cast à float est correct pour la division entière. Vous divisez deux entiers, puis le résultat est converti en un float. Un nombre entier divisé par un nombre entier est un nombre entier. Essayez quelque chose comme: 'Float (i)/Float (100.0)' à la place et voyez si cela fonctionne. – Brandon

+0

@Brandon Thx pour votre réponse. Je pense que ce n'est pas le problème. Si je mets mon code comme ça dans la boucle, la progression de 0.5 ne sera montrée qu'après toutes les choses faites. DispatchQueue.main.async {//SVProgressHUD.showProgress(Float(featureID)/Float(featuresNum), état: "Chargement en cours ...") SVProgressHUD.showProgress (0.5, état: "Chargement en cours ...") } –

Répondre

1

essai ci-dessous code: -

DispatchQueue.global(qos: .userInitiated).async(execute: { 
    Alamofire.request(queryURL).responseJSON() { response in 
    //Do something 
    for i in 0..<100{ 
     //Do lots of things 
     DispatchQueue.main.async { 
      SVProgressHUD.showProgress(Float(i)/100 as Float, status: "Loading...") 
     } 
    } 
//Dismiss 
}) 

Il affiche comme ....

0,0 0,01 0,02 0,03 0,04 0,05 0,06 0,07 0,08 0,09 0,1 0,11 0,12 0,13 0,14 0,15 0,16 0,17 0,18 0,19 0,2 0,21 0,22 0,23 0,24 0,25 0,26 0,27 0,28 0,29 0,3 0,31 0,32 0,33 0,34 0,35 0,36 0,37 0,38 0,39 0,4 0,41 0,42 0,43 0,44 0,45 0,46 0,47 0,48 0,49 0,5 0,51 0,52 0,53 0,54 0,55 0,56 0,57 0,58 0,59 0,6 0,61 0,62 0,63 0,64 0,65 0,66 0,67 0,68 0,69 0,7 0,71 0,72 0,73 0,74 0,75 0,76 0,77 0,78 0,79 0,8 0,81 0,82 0,83 0,84 0,85 0,86 0,87 0,88 0,89 0,9 0,91 0,92 0,93 0,94 0,95 0,96 0,97 0.98 0,99

0

Il existe deux types de threads. Vous pouvez en trouver plus sur ce lien en bas. Ui ne fonctionne que sur simultané

Click here on link to know more

d'Apple ne permet pas de changer les commandes dans ui fil. Donc, vous devez mettre à jour ui en dehors du fil.