2010-11-11 15 views
18

Ho il codice seguente:Come cambio i tempi per NSTimer?

timer = [[NSTimer scheduledTimerWithTimeInterval:0.50 target:self selector:@selector(onTimer) userInfo:nil repeats:YES] retain];  

-(void) onTimer 
{ 
} 

Dopo ogni 0,50 secondi il metodo OnTimer viene chiamato.

Ma ora voglio aumentare l'intervallo di tempo.

Ciò significa:

OnTimer calls after 0.55 
OnTimer calls after 0.60 
OnTimer calls after 0.65 
OnTimer calls after 0.70 
OnTimer calls after 0.75 
& so on. 

C'è qualche soluzione per questo ?? Ho provato molto ma non funziona.

risposta

21

Certo si può fare questo. Modificare repeats:YES a repeats:NO in modo che il timer non si ripeta, quindi in onTimer, avviare un nuovo timer con un intervallo più lungo. Hai bisogno di una variabile per mantenere l'intervallo in modo da poterlo rendere un po 'più lungo ogni volta tramite onTimer. Inoltre, probabilmente non hai più bisogno di mantenere il timer, poiché sparerà solo una volta e, quando lo farà, otterrai un nuovo timer.

Non sono un esperto Objective-C (o perito iOS ...) ed è stato un po ', ma penso che qualcosa di simile:

float gap = 0.50; 

[NSTimer scheduledTimerWithTimeInterval:gap target:self selector:@selector(onTimer) userInfo:nil repeats:NO]; 

-(void) onTimer { 
    gap = gap + .05; 
    [NSTimer scheduledTimerWithTimeInterval:gap target:self selector:@selector(onTimer) userInfo:nil repeats:NO]; 
} 

Qualcosa del genere? Oh, e non sono molto sicuro della semantica retain qui ... leggi i documenti per assicurarti di non perdere!

+0

Grazie, sta funzionando bene ora. –

+0

L'oggetto NSTimer verrà deallocato automaticamente al termine del timer. – qwertz

4

Si potrebbe provare a regolare FireDate del timer, vedere setFireDate

6

Qui è una soluzione alla domanda di Hardik usando proprietà fireDate di NSTimer (scritto in Swift):

var timeInterval = 0.50 
NSTimer.scheduledTimerWithTimeInterval(timeInterval, target: self, selector: Selector("onTimer:"), userInfo: nil, repeats: true) 

func onTimer(timer: NSTimer) { 
    timeInterval += 0.05 
    timer.fireDate = timer.fireDate.dateByAddingTimeInterval(timeInterval) 
} 
+0

non puoi _re-fire_ un timer come questo. – holex

+0

per me funziona. Ecco il codice: https://gist.github.com/anonymous/86005ed7049e985a34f6 E btw. il timer si ripete su true e sto solo impostando la prossima data dell'incendio. –

+1

Per quanto ho letto la documentazione di NSTimer usando setFireDate va assolutamente bene (https://developer.apple.com/library/ios/documentation/cocoa/reference/foundation/classes/NSTimer_Class/Reference/NSTimer.html#// apple_ref/OCC/INSTM/NSTimer/setFireDate :). –

1

Non è possibile modificare l'intervallo in cui un timer incendi. Non c'è modo. Non ci sono API per farlo.

Due soluzioni ovvie: se si sempre modificare l'intervallo, quindi è possibile modificare la prossima volta che il timer si attiva; questo ha la precedenza sull'intervallo del timer. Ovviamente lo devi fare ogni volta che scatta il timer. Se si a volte modificare l'intervallo, è sufficiente invalidare il primo timer e creare un nuovo timer con il nuovo intervallo.

0

Questo funziona per me come un fascino.

- (void)FlexibleTimer { 
    if (!keyTimer) { 
     keyTimer = [NSTimer scheduledTimerWithTimeInterval:self.intervalOfIdleTimer 
                 target:self 
                selector:@selector(keyTimerExceeded) 
                userInfo:nil 
                repeats:YES]; 
    } 
    else { 
     if (fabs([keyTimer.fireDate timeIntervalSinceNow]) < self.intervalOfIdleTimer - 1.0) { 
      [keyTimer setFireDate:[NSDate dateWithTimeIntervalSinceNow:self.intervalOfIdleTimer]]; 
     } 
    } 
} 

- (void)keyTimerExceeded { 
    [self setNextDelayForFlexibleTimer]; 
    [self FlexibleTimer]; 
    NSLog(@"Timer Exceeded %f", [[NSDate date] timeIntervalSince1970]); 
}