Problème de rafraîchissement
Hello,
Un p'tit soucis que je n'arrive pas à comprendre, j'ai une window dans laquelle je souhaite mettre à jour une progressbar mais ça ne fonctionne pas, ça m'affiche la valeur qu'une fois le traitement fini...
progress ou même un texte que j'essaye de mettre à jour rien n'y fait temps que c'est pas fini alors que dans les logs ça réagit en temps réel O_o
https://github.com/Old-Geek/Librairie/blob/master/Librairie/Views/Dialog/InfoEditDialog.m#L344
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Deux possibilités :
1. ton traitement bloque le main thread et donc l'update graphique ne se fait qu'à la fin du traitement.
2. tu dois utiliser
- (void)incrementBy:(double)delta;
sur ta progress bar au lieu de changer sa valeur directement.Les deux ne sont pas mutuellement exclusives.
C'est probablement parce que tu exécutes ton traitement sur le thread principal, celui de l'interface graphique.
Les traitements longs doivent être faits sur un thread secondaire.
Voir NSOperation/NSOperationQueue ou Grand Central Dispatch (fonctions avec le préfixe dispatch_).
J'ai déjà testé tout ça, rien ne passe
Plusieurs questions :
Tu fais un reload dans saveInZip. Tu reload tout ?
Est-ce que la sauvegarde en Zip est synchrone ?
Parce que vu ta loop, c'est normal, il va arriver à 100% trop rapidement pour que tu aies le temps de t'en apercevoir.
Je ne comprends pas ton incrémentation. Tu mets la valeurs à 50, puis tu updates de 1.
Tu ne souhaites pas faire plutôt : float increment = totalDone/total ?
J'ai tout testé, synchrone, asynchrone, à plusieurs niveau différent. J'ai collé un log dans la loop pour vérifier la vitesse de défilement.
Les valeurs présentes sont à ignorer, ce sont des restes de tout ce que j'ai pu tester et le code n'est pas propre, pour le moment j'essaye de trouver une solution.
Si, le but est de laisser progressBar.doubleValue = value
D'après ce que j'ai pu trouver c'est apple qui a volontairement bloqué cette possibilité à partir de high sierra. Ceux qui le font pour des versions antérieur n'ont pas ce problème.
J'essaye de contourner le problème mais bon, le verrouillage est le crédo d'apple.
J'essaye même de tenter de faire une pause dans le thread pour permettre à la progressbat d'avancer mais ça aussi ça foire
A mon avis il faut que j'extrais toute les données à traiter pour le balancer dans un truc totalement indépendant de cette fenêtre.
\o/
Création d'un objet, je balance tout le matériel dedans, lancement en async et récupération de la progression via un listener.
Résolu
Donc, je viens de vérifier ton code et tu n'utilises pas les threads, à part du principal. J'attendais trouver quelque chose comme NSNotificationCenter dans le code mais, je n'attendais jamais telle pagaille !
Pourquoi tu utilises un NSNotificationCenter pour tenir l'observer ? Il ne faut qu'un id !
Et, tu addObserver quelque part mais tu removeObserver ailleurs. Non, il faut les utiliser en équilibre, dans le même objet. Et je peux pas trouve mainQueue nulle part.
Il faut relire les docs sur NSNotificationCenter.
Ben, y'en a 2 remover, un sur cancel et l'autre à la fin de setProgress pour clore la fenêtre une fois terminé
Pour ce qui est d'utiliser les threads faudrait que j'en ai des notions.
Parce que id ça me parle pas dit comme ça
Il faut un mainQueue ?
Quelle doc ? j'apprend principalement sur github avec ce que ça implique. La doc d'apple est soit périmé soit pour swift soit j'y comprend rien. Elle est principalement faite pour des dev ce que je ne suis pas (juste un tech téléinformatique). Quand je fais des recherches je tombre principalement sur de l'IOS à plus de 80%
Bref, je fais ce que je peux avec ce que je trouve et les infos qu'on me donne ici.
J'ai un peu testé stackoverflow mais avec ce système de récompense/grade et autre y'a des types qui postent principalement pour gonfler leurs stats et sont parfois encore plus mauvais que moi
Pour le bordel c'est normal, d'abord je fais mon truc ensuite je relis tout pour remettre au propre. Je sais pas ou je mets les pieds ni dans quel sens aller alors je fais un truc qui fait ce que je lui demande et ensuite je cherche la meilleur façon d'améliorer tout ça.
C'est p'tet pas la meilleur méthode mais je fais avec.
Je déconne pas quand je dis que j'y connais rien du tout, je m'y met tout juste à la prog. Avant ça c'tait juste du bash script et encore... du bricolage de rustine.
Je note tout vos conseil, astuce et une fois que mon prog fait ce que je lui demande je tente de les appliquer au mieux.
P'tet à prendre en compte, je suis 100% autodidacte (bac -5), ça peut aussi expliquer aussi cela.
Tu peux choisir la langue, soit Swift, soit Objective-C
https://developer.apple.com/documentation/foundation/nsnotificationcenter?language=objc
NSNotificationCenter n'a pas vraiment changé et c'est le même pour les deux langues, sauf la syntaxe.
Surtout, il faut comprendre ce que tu fasses ; sinon, tes applis ne marcheront pas avec les nouveaux contrôles gardiens dans macOS.
Mais, courage ! J'ai commencé à apprendre la programmation à l'age de 37 ans, sans qualifications de l'école secondaire. Ça fait presque 30 ans maintenant