Warum sollte ein 'terminatedTimer' beim Setup außerhalb eines Blocks, aber nicht innerhalb eines Blocks, ordnungsgemäß ausgelöst werden?

8

Das folgende Code-Snippet funktioniert perfekt, wenn es außerhalb eines Completion-Blocks aufgerufen wird, aber der Timer wird nie ausgelöst, wenn ich ihn innerhalb des Blocks eingerichtet habe. Ich verstehe nicht, warum es einen Unterschied gibt:

%Vor%

Ich habe die Selbstreferenzen nicht verwendet, als ich sie anfänglich außerhalb des Blocks anrief, aber dann, wenn ich mich einmal drinnen befand, war es erforderlich. Ich habe jedoch genau den gleichen Code außerhalb des Blocks erneut getestet und es funktioniert immer noch.

Der Block ist ein Completion-Handler, der aufgerufen wird, nachdem die Berechtigung für HealthKit -bezogene Informationen angefordert wurde.

    
Kevin 02.07.2016, 20:15
quelle

1 Antwort

27

Das Problem besteht darin, dass der fragliche Completion-Block wahrscheinlich nicht im Hauptthread ausgeführt wurde und daher keine Ausführungsschleife hatte. Timer müssen jedoch in einer Ausführungsschleife eingeplant werden, und während der Hauptthread über einen verfügt, werden die meisten Hintergrundthreads nicht ausgeführt (es sei denn, Sie fügen einen selbst hinzu).

Um dies zu beheben, schicken Sie in diesem Completion-Handler die Erstellung des Timers zurück zum Haupt-Thread und es sollte funktionieren:

%Vor%

Oder verwenden Sie einen Dispatch Source Timer (einen Timer, der für eine Hintergrundwarteschlange eingeplant werden kann und keine Laufschleife benötigt).

%Vor%     
Rob 02.07.2016, 20:27
quelle

Tags und Links