Necesito obtener el tiempo transcurrido entre dos eventos: por ejemplo, entre la aparición de UIView y entre la primera reacción del usuario.Obteniendo el tiempo transcurrido (Objective-c)
Respuesta
NSDate *start = [NSDate date];
// do stuff...
NSTimeInterval timeInterval = [start timeIntervalSinceNow];
timeInterval
es la diferencia entre el inicio y ahora, en segundos, con una precisión sub-milisegundo.
utilizar la función timeIntervalSince1970 de la clase NSDate, como a continuación:
double start = [startDate timeIntervalSince1970];
double end = [endDate timeIntervalSince1970];
double difference = end - start;
Básicamente, esto es lo que yo uso para comparar la diferencia en segundos entre 2 fechas diferentes. También comprobar este enlace here
Para mediciones de tiempo percise (como GetTickCount), también echar un vistazo a mach_absolute_time y esto Manzana Q & A: http://developer.apple.com/qa/qa2004/qa1398.html.
utilizar el método de timeIntervalSinceDate
NSTimeInterval secondsElapsed = [secondDate timeIntervalSinceDate:firstDate];
NSTimeInterval
es sólo un double
, definir en NSDate
así:
typedef double NSTimeInterval;
para nadie viene aquí buscando una aplicación GetTickCount() para iOS, aquí es el mío después de juntar varias fuentes:
#include <mach/mach.h>
#include <mach/mach_time.h>
uint64_t getTickCount(void)
{
static mach_timebase_info_data_t sTimebaseInfo;
uint64_t machTime = mach_absolute_time();
// Convert to nanoseconds - if this is the first time we've run, get the timebase.
if (sTimebaseInfo.denom == 0)
{
(void) mach_timebase_info(&sTimebaseInfo);
}
// Convert the mach time to milliseconds
uint64_t millis = ((machTime/1000000) * sTimebaseInfo.numer)/sTimebaseInfo.denom;
return millis;
}
¿Alguien sabe por qué hay un molde redundante (vacío) en la llamada mach_timebase_info? –
@SimonTillson es una buena pregunta, ya sea que se requirió silenciar una advertencia, o la copié desde otro lugar y simplemente no me di cuenta de que debía eliminarla. No puedo recordar –
No debe confiar en [NSDate date]
por motivos de tiempo, ya que puede informar en exceso o por debajo del tiempo transcurrido. ¡Incluso hay casos en los que aparentemente su computadora viajará en el tiempo ya que el tiempo transcurrido será negativo! (Por ejemplo, si el reloj se movió hacia atrás, durante la temporización.)
De acuerdo con Aria Haghighi en la conferencia "avanzada iOS Reconocimiento de gestos" de la Winter 2013 Stanford iOS course (34:00), se debe utilizar CACurrentMediaTime()
si necesita un intervalo de tiempo preciso.
Objective-C:
#import <QuartzCore/QuartzCore.h>
CFTimeInterval startTime = CACurrentMediaTime();
// perform some action
CFTimeInterval elapsedTime = CACurrentMediaTime() - startTime;
Swift:
let startTime = CACurrentMediaTime()
// perform some action
let elapsedTime = CACurrentMediaTime() - startTime
La razón es que [NSDate date]
se sincroniza en el servidor, por lo que podría conducir a "hipo tiempo de sincronización" que puede conducir a errores muy difíciles de rastrear. CACurrentMediaTime()
, por otro lado, es una hora del dispositivo que no cambia con estas sincronizaciones de red.
Necesitará add el QuartzCore framework a la configuración de su destino.
Por favor, vote esto. Aunque creo que todos pueden estar de acuerdo en que NSDate debería ser su primera opción, esta sugerencia resolvió un problema mío. Cuando llamé a '[NSDate date]' dentro de un bloque de finalización dentro de un bloque de despacho, estaba obteniendo la misma hora "actual" que informaba '[NSDate date]' inmediatamente antes de que la ejecución alcanzara el punto en el que se crearon mis bloques. 'CACurrentMediaTime()' resolvió este problema. – n00neimp0rtant
¿Cómo utilizaríamos el tiempo transcurrido para mostrar como mm: ss? – CyberMew
¿Por qué nunca oí hablar de esto? – Morkrom
Otras respuestas son correctas (con una advertencia *).Añado esta respuesta simplemente para mostrar un ejemplo de uso:
- (void)getYourAffairsInOrder
{
NSDate* methodStart = [NSDate date]; // Capture start time.
// … Do some work …
NSLog(@"DEBUG Method %s ran. Elapsed: %f seconds.", __func__, -([methodStart timeIntervalSinceNow])); // Calculate and report elapsed time.
}
En el depurador de consola, que se ve algo como esto:
DEBUG Method '-[XMAppDelegate getYourAffairsInOrder]' ran. Elapsed: 0.033827 seconds.
* Advertencia: Como otros mencionado , use NSDate
para calcular el tiempo transcurrido solo para fines ocasionales. Uno de estos propósitos podría ser la evaluación común, el perfil bruto, en el que solo se desea una idea aproximada de cuánto tiempo está tomando un método.
El riesgo es que la configuración de la hora actual del reloj del dispositivo podría cambiar en cualquier momento debido a la sincronización del reloj de la red. Por lo tanto, el tiempo NSDate
podría avanzar o retroceder C en cualquier momento.
- 1. localizando el tiempo transcurrido
- 2. Powershell mostrar el tiempo transcurrido
- 3. tiempo transcurrido en Qt
- 4. Transact-SQL para resumir el tiempo transcurrido
- 5. transcurrido el tiempo para cada regla
- 6. Calcular el tiempo transcurrido en php
- 7. obteniendo el error "invalid_client" en la muestra gdata-objectivec-client
- 8. rápido tiempo transcurrido en Linux
- 9. Obtenga el tiempo transcurrido desde el inicio de la aplicación
- 10. Medición del tiempo transcurrido en python
- 11. Manipulación y almacenamiento del tiempo transcurrido
- 12. Python - ¿Cómo calcular el tiempo transcurrido desde la fecha X?
- 13. ¿Cómo puedo obtener el tiempo transcurrido en milisegundos en Ruby?
- 14. Uso de un NSDate estático para determinar el tiempo transcurrido
- 15. Mide el tiempo transcurrido entre dos MotionEvents en Android
- 16. SQL para encontrar el tiempo transcurrido desde múltiples intervalos solapados
- 17. ¿Cómo calcular el tiempo transcurrido en segundos en VBA?
- 18. JodaTime PeriodFormat, tiempo transcurrido con solo 1 campo
- 19. Tiempo de uso transcurrido como afirmación en pruebas unitarias
- 20. Cálculo del tiempo transcurrido en un programa C en milisegundos
- 21. actionscript 3 cómo hacer un seguimiento del tiempo transcurrido?
- 22. ¿Por qué obtengo un tiempo transcurrido negativo usando System.nanoTime()?
- 23. Tiempo transcurrido de ejecución de un programa en C
- 24. Necesito calcular un tiempo transcurrido entre dos objetos de fecha
- 25. ¿Cómo obtener el tiempo transcurrido en milisegundos en el script bash?
- 26. El tiempo de espera transcurrido antes de obtener una conexión desde el grupo
- 27. SQl Server sigue recibiendo el error de "Tiempo de espera caducado. El tiempo de espera ha transcurrido"
- 28. C# transcurrido en un temporizador?
- 29. objectivec: fb publicar comentario error
- 30. Bloques ObjectiveC equivalente en Java
+1, Nice and East Answer. Gracias. :) – mAc
por lo que es un valor negativo si entendí correctamente –
@NicolasZozol puede usar 'fabs (...)' para obtener el valor absoluto de un flotante. P.ej. 'NSTimeInterval timeInterval = fabs ([start timeIntervalSinceNow]);' –