2010-08-19 18 views
37

Estoy tratando de hacer un cronómetro con NSTimer.¿Cómo escribo un temporizador en Objective-C?

me dio el siguiente código:

nst_Timer = [NSTimer scheduledTimerWithTimeInterval:0.001 target:self selector:@selector(showTime) userInfo:nil repeats:NO]; 

y no está trabajando en milisegundos. Tarda más de 1 milisegundo.

Respuesta

87

No use NSTimer de esa manera. NSTimer se usa normalmente para disparar un selector en algún intervalo de tiempo. No es de alta precisión y no es adecuado para lo que quieres hacer.

Lo que queremos es un temporizador clase de alta resolución (usando NSDate):

Salida:

Total time was: 0.002027 milliseconds 
Total time was: 0.000002 seconds 
Total time was: 0.000000 minutes 

principal:

Timer *timer = [[Timer alloc] init]; 

[timer startTimer]; 
// Do some work 
[timer stopTimer]; 

NSLog(@"Total time was: %lf milliseconds", [timer timeElapsedInMilliseconds]); 
NSLog(@"Total time was: %lf seconds", [timer timeElapsedInSeconds]); 
NSLog(@"Total time was: %lf minutes", [timer timeElapsedInMinutes]); 

Edición: métodos Añadido para -timeElapsedInMilliseconds y -timeElapsedInMinutes

Timer.h:

#import <Foundation/Foundation.h> 

@interface Timer : NSObject { 
    NSDate *start; 
    NSDate *end; 
} 

- (void) startTimer; 
- (void) stopTimer; 
- (double) timeElapsedInSeconds; 
- (double) timeElapsedInMilliseconds; 
- (double) timeElapsedInMinutes; 

@end 

Timer.m

#import "Timer.h" 

@implementation Timer 

- (id) init { 
    self = [super init]; 
    if (self != nil) { 
     start = nil; 
     end = nil; 
    } 
    return self; 
} 

- (void) startTimer { 
    start = [NSDate date]; 
} 

- (void) stopTimer { 
    end = [NSDate date]; 
} 

- (double) timeElapsedInSeconds { 
    return [end timeIntervalSinceDate:start]; 
} 

- (double) timeElapsedInMilliseconds { 
    return [self timeElapsedInSeconds] * 1000.0f; 
} 

- (double) timeElapsedInMinutes { 
    return [self timeElapsedInSeconds]/60.0f; 
} 

@end 
+0

Esa fue una explicación fantástica ... Gracias pero un problema. cómo convertir este doble a un formato de hora como "Hr: Sec: Min: Millsec" –

+1

Esta clase no contiene un método dealloc. ¿No se filtra esto? – midas06

+2

Si quisiera usar esta clase para ejecutar un bloque de código repetidamente (como un NSTimer repetitivo), ¿cómo haría esto? – Sabobin

0

si quieres un temporizador de cuenta atrás a partir de un cierto tiempo en segundos , en primer lugar, no use el bloque de código suministrado en la esquina inferior derecha proporcionada por Xcode, no funciona. En su lugar, haga esto:

printf("set timer in seconds\n"); 
    int timer; 
    scanf("%d", &timer); 
    while(timer >= 1){ 
     sleep(1); 
     timer--; 
     printf("%i\n", timer); 
    } 
Cuestiones relacionadas