Ich weiß nicht viel über Blöcke. Wie würden Sie eine wiederholte NSTimer
mit dispatch_after()
imitieren? Mein Problem ist, dass ich einen Timer "pausieren" möchte, wenn die App in den Hintergrund bewegt, aber Unterklasse NSTimer
scheint nicht zu funktionieren.iPhone: Verwenden von dispatch_after, um NSTimer zu imitieren
Ich habe etwas versucht, das zu funktionieren scheint. Ich kann seine Auswirkungen auf die Leistung nicht beurteilen, oder ob sie stark optimiert werden könnten. Jede Eingabe ist willkommen.
#import "TimerWithPause.h"
@implementation TimerWithPause
@synthesize timeInterval;
@synthesize userInfo;
@synthesize invalid;
@synthesize invocation;
+ (TimerWithPause *)scheduledTimerWithTimeInterval:(NSTimeInterval)aTimeInterval target:(id)aTarget selector:(SEL)aSelector userInfo:(id)aUserInfo repeats:(BOOL)aTimerRepeats {
TimerWithPause *timer = [[[TimerWithPause alloc] init] autorelease];
timer.timeInterval = aTimeInterval;
NSMethodSignature *signature = [[aTarget class] instanceMethodSignatureForSelector:aSelector];
NSInvocation *aInvocation = [NSInvocation invocationWithMethodSignature:signature];
[aInvocation setSelector:aSelector];
[aInvocation setTarget:aTarget];
[aInvocation setArgument:&timer atIndex:2];
timer.invocation = aInvocation;
timer.userInfo = aUserInfo;
if (!aTimerRepeats) {
timer.invalid = YES;
}
[timer fireAfterDelay];
return timer;
}
- (void)fireAfterDelay {
dispatch_time_t delay = dispatch_time(DISPATCH_TIME_NOW, self.timeInterval * NSEC_PER_SEC);
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_after(delay, queue, ^{
[invocation performSelectorOnMainThread:@selector(invoke) withObject:nil waitUntilDone:NO];
if (!invalid) {
[self fireAfterDelay];
}
});
}
- (void)invalidate {
invalid = YES;
[invocation release];
invocation = nil;
[userInfo release];
userInfo = nil;
}
- (void)dealloc {
[self invalidate];
[super dealloc];
}
@end
Ich habe versucht, dass durch die Informationen innerhalb userinfo speichern. Aber ich denke nicht, dass du das aktualisieren kannst. Es außerhalb des Timer-Objekts zu speichern macht wenig Sinn. Ich könnte den Timer in ein anderes Objekt einpacken, aber ich denke nicht, dass das eine sehr elegante Lösung ist. Kann das immer noch tun ... –
Wenn Sie diese Informationen innerhalb des Timers persistieren möchten, warum verwenden Sie nicht eine veränderbare Sammlung als 'userInfo' des Timers? Wickle die verbleibende Zeit bis zum nächsten 'fireDate' in einer NSNumber und speichere sie in der Sammlung, die die userInfo des Timers ist ... – danyowdee
Ich habe tatsächlich eine Kategorie erstellt, die genau das tut: https://github.com/adamjernst/NSTimer- AbsoluteFireDate –