Je veux afficher l'heure (y compris les secondes) dans une application dans un champ de texte, assez simple. Ce que je fais actuellement, c'est créer un NSTIMER qui fonctionne toutes les 0,1 secondes qui obtiennent le temps système et met à jour le champ de texte. Cela semble être un moyen terriblement inefficace d'accomplir cela. Y a-t-il une meilleure façon? P>
4 Réponses :
l'affiche-vous à une résolution dixième de deuxième (ou plus fin)? p>
Si oui, je ne vois pas de problème. Habituellement, le sondage craint que ce que vous vérifiez n'aurait peut-être pas changé, mais ce n'est pas comme si le temps va s'arrêter sur vous. Donc, une minuterie dixième de seconde est bien. P>
Sinon, créez une minuterie dont l'intervalle est la résolution souhaitée, puis obtenez sa date d'incendie, autour de la résolution souhaitée (par exemple, une seconde entière si vous mettez à jour chaque seconde), et définissez cela comme la nouvelle date d'incendie . Ensuite, votre minuterie ne tiendra que coïncidemment avec le temps qu'il convient de mettre à jour votre vue d'horloge. P>
Notez que lorsque le temps passe toujours, il ne bouge pas toujours linéairement: il peut sauter de l'heure ou une demi-heure ou une demi-heure, ou une quantité si l'utilisateur (ou NTPD) modifie le réglage de l'horloge système. Sur Mac OS X 10.6 et ultérieure, vous pouvez observer pour le NSSYSTEMClockDidLangenotification code> et réaffecter la date d'incendie de votre minuterie lorsque cela se produit. P>
Je n'affiche que à une deuxième résolution. Mais si je sondre à une seconde, je pourrais être, par exemple, .9 secondes de retard sur la mise à jour de mon texte. Si un utilisateur dispose de l'option "Afficher secondes" définie sur leur horloge dans la barre de menus, je souhaite que l'application apparaisse pour mettre à jour le texte de l'heure à l'heure exacte, la barre de menu change des secondes, sondant ainsi 10 fois une seconde.
Vous ne serez pas de 0,9 secondes de retard si vous avez défini la date d'incendie correctement. La minuterie devrait être à la traîne assez difficile de tirer cela hors tension - et s'il est en retard de 0,9 seconde, définir son intervalle à 0,1 seconde ne va pas aider.
Je ne suis pas sûr de quoi d'autre serait plus efficace. Tant que le rappel de votre minuterie ne fait rien de trop intensif, vous êtes probablement proche d'optimal. P>
Que diriez-vous d'utiliser GetTimeOdday (2) code>? Il renvoie beaucoup d'informations de temps exacts à utiliser. P>
Cela ne conserve pas l'affichage mis à jour, cependant. Obtenir l'heure actuelle n'est pas la partie difficile; C'est la mise à jour périodique que le questionneur se demandait. De plus, votre affirmation selon laquelle GetTimeOdDay code> "renvoie beaucoup [plus] informations exactes de l'heure" manque de comparaison: plus précis que quoi?
Que diriez-vous d'utiliser NSTIMER qui fonctionne chaque seconde, puis vous vérifiez le temps de tir et assurez-vous qu'il est exactement au début d'une seconde. Vous pouvez utiliser initwithfairedate: intervalle: cible: sélecteur: userinfo: répétements: code> ou définissez le temps d'invocation suivant en utilisant
SetFiaire: code> Une fois la minuterie créée:
NSTimeInterval interval = [[timer fireDate] timeIntervalSinceReferenceDate];
NSTimeInterval nextFire = ceil(interval);
[timer setFireDate: [NSDate dateWithTimeIntervalSinceReferenceDate: nextFire];