2016-05-19 12 views
0

Ich benutze den folgenden Code, um die Ausführung des Selektors saveCurrentDocument zu entprellen.NSTimer kann nicht ungültig gemacht werden, wenn er innerhalb des Hintergrundthreads aufgerufen wird

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
    if (debounceTimer != NULL) { 
     [debounceTimer invalidate]; 
     debounceTimer = NULL; 
    } 

    debounceTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(saveCurrentDocument) userInfo:nil repeats:NO]; 
    [[NSRunLoop currentRunLoop] addTimer:debounceTimer forMode:NSDefaultRunLoopMode]; 
    [[NSRunLoop currentRunLoop] run]; 
}); 

Zur Zeit bemerkte ich, dass dispatch_get_global_queue (DISPATCH_QUEUE_PRIORITY_DEFAULT, 0) in der App eines anderen Thread jedes Mal ein User-Typen einen Brief zu schaffen, also versuchte ich es zu, dies zu ändern:

if (debounceQueue == nil) { 
    debounceQueue = dispatch_queue_create("com.testing.SaveQueue", NULL); 
} 

dispatch_async(debounceQueue, ^{ 
    if (debounceTimer != NULL) { 
     [debounceTimer invalidate]; 
     debounceTimer = NULL; 
    } 

    debounceTimer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(saveCurrentDocument) userInfo:nil repeats:NO]; 
    [[NSRunLoop currentRunLoop] addTimer:debounceTimer forMode:NSDefaultRunLoopMode]; 
    [[NSRunLoop currentRunLoop] run]; 
}); 

Aber jetzt [debounceTimer invalidate] funktioniert nicht mehr und ruft saveCurrentDocument jedes Mal auf.

Kann mir jemand erklären, warum das passiert?

Antwort

0

Es sieht so aus, als würden Sie den Runloop zweimal dem Timer hinzufügen. Sie sollten entweder den addTimer entfernen und Zeilen nach der Instanziierung von debunceTimer ausführen, oder alternativ können Sie timerWithTimeInterval ... anstelle von planedTimerWithTimeInterval ... verwenden

+0

Vielen Dank für die Kenntnis, dass hier behoben. Aber ich habe immer noch das gleiche Problem, Invalidate funktioniert nicht, wenn Sie ein DISPATCH_QUEUE_SERIAL auf dispatch_queue_create verwenden –

+0

Dies könnte helfen: http://StackOverflow.com/Questions/10522928/Run-Repeating-nstimer-with-gcd – mikepj

Verwandte Themen