2009-11-05 9 views
6

Desidero visualizzare l'ora (compresi i secondi) in un'applicazione in un campo di testo, piuttosto semplice. Quello che faccio attualmente è creare un NSTimer che viene eseguito ogni 0,1 secondi che ottiene l'ora del sistema e aggiorna il campo di testo. Questo sembra un modo terribilmente inefficiente per realizzare questo. C'è un modo migliore?Come visualizzare in modo efficiente il tempo in secondi in Cocoa?

risposta

6

Stai visualizzando la risoluzione del decimo di secondo (o più fine)?

Se è così, non vedo alcun problema. Di solito, il sondaggio fa schifo perché quello che stai verificando potrebbe non essere cambiato, ma non è come se il tempo si fermasse su di te. Quindi un timer di un decimo di secondo va bene.

In caso contrario, creare un timer il cui intervallo è la risoluzione desiderata, quindi ottenere la data dell'incendio, arrotondarlo alla risoluzione desiderata (ad esempio, un intero secondo se si aggiorna ogni secondo) e impostarlo come nuovo fuoco Data. Quindi, il tuo timer scatterà solo per coincidenza con i tempi in cui è opportuno aggiornare la visualizzazione dell'orologio.

Si noti che mentre il tempo si sposta sempre, non sempre si muove linearmente: può saltare avanti o indietro di un'ora o mezz'ora, o qualsiasi importo se l'utente (o ntpd) cambia l'impostazione dell'orologio di sistema. Su Mac OS X 10.6 e versioni successive, puoi osservare per lo NSSystemClockDidChangeNotification e regolare nuovamente la data di attivazione del timer quando ciò accade.

+0

Sto visualizzando solo una risoluzione di un secondo. Ma se scrivo un secondo potrei essere, ad esempio, 0,9 secondi in ritardo sull'aggiornamento del mio testo. Se un utente ha l'opzione "display seconds" impostata sul suo orologio sulla barra dei menu, voglio che app appaia per aggiornare il testo dell'ora nel momento esatto in cui la barra dei menu cambia secondi, quindi esegue il polling 10 volte al secondo. – rscott

+0

Non sarai in ritardo di 0,9 secondi se hai impostato correttamente la data dell'incendio. Il timer dovrebbe essere abbastanza difficile da escluderlo e, se è ritardato di 0,9 secondi, impostare il suo intervallo su 0,1 secondi non sarà di aiuto. –

0

Non sono sicuro di cos'altro sarebbe più efficiente. Finché la richiamata per il tuo timer non sta facendo nulla di troppo intensivo, probabilmente sei vicino a quello ottimale.

-2

Che ne dici di utilizzare gettimeofday(2)? Restituisce informazioni sull'ora molto precise da utilizzare.

+1

Ciò non mantiene il display aggiornato, però. Ottenere l'ora attuale non è la parte difficile; è l'aggiornamento periodico a cui l'interrogante si stava interrogando. Inoltre, la tua affermazione che 'gettimeofday'" restituisce molte [più] informazioni sull'ora esatta "manca di un confronto: più esatto di cosa? –

2

Che ne dici di utilizzare NSTimer che viene eseguito ogni secondo, quindi controlli il tempo di accensione e assicurati che sia esattamente all'inizio di un secondo. È possibile utilizzare initWithFireDate:interval:target:selector:userInfo:repeats: o impostare il tempo di invocazione successiva in modo appropriato utilizzando setFireDate: dopo che il timer è stato creato:

NSTimeInterval interval = [[timer fireDate] timeIntervalSinceReferenceDate]; 
NSTimeInterval nextFire = ceil(interval); 
[timer setFireDate: [NSDate dateWithTimeIntervalSinceReferenceDate: nextFire]; 

allora sarete sicuri che i timer incendi più vicino al tempo necessario possibile e non si preoccupano il timer resta indietro perché si reimposta dopo ogni sparo utilizzando la data e l'intervallo di sparo che hai fornito, quindi cercherà sempre di sparare al secondo esatto (ma sparerà ogni volta che il ciclo di esecuzione sarà in grado di farlo).

Problemi correlati