2010-08-19 7 views
37

J'essaie de faire un chronomètre avec NSTimer.Comment écrire un minuteur en Objective-C?

je lui ai donné le code suivant:

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

et il ne fonctionne pas en millisecondes. Cela prend plus de 1 milliseconde.

Répondre

87

N'utilisez pas NSTimer de cette façon. NSTimer est normalement utilisé pour déclencher un sélecteur à un intervalle de temps donné. Ce n'est pas de haute précision et n'est pas adapté à ce que vous voulez faire.

Ce que vous voulez est un timer haute résolution classe (en utilisant NSDate):

Sortie:

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]); 

Edit: Ajout des méthodes pour -timeElapsedInMilliseconds et -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

C'était une explication fantastique ... Merci, mais un prob. comment convertir ce double en un format d'heure comme "Hr: Sec: Min: Millsec" –

+1

Cette classe ne contient pas de méthode dealloc. Est-ce que cette fuite ne va pas? – midas06

+2

Si je voulais utiliser cette classe pour exécuter un bloc de code à plusieurs reprises (comme un NSTimer répétitif), comment ferais-je cela? – Sabobin

0

si vous voulez une minuterie qui compte à rebours d'un certain temps en secondes , tout d'abord n'utilisez pas le bloc de code fourni dans le coin inférieur droit fourni par Xcode, cela ne fonctionne pas. Au lieu de cela, faites ceci:

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