Gibt es eine Möglichkeit, dispatch_after() für einige Zeit in Zukunft geplant, und bisher nicht gefeuert? Ich versuche, etwas wie ein Scheduler für Updates vom Server zu machen, und diese Methode ist genau wie ich will, aber ich würde es gerne irgendwann abbrechen und neu planen. Ist es überhaupt möglich oder muss ich zurückfallen und NSTimer verwenden?abbrechen dispatch_after() Methode?
Antwort
Verwenden Sie eine Dispatch-Timer-Quelle (das wird dispatch_after
ohnehin intern verwendet).
Eine Sende-Timer-Quelle kann abgebrochen oder ihre Timer-Parameter nach der Erstellung geändert werden.
Es gibt KEINE Möglichkeit zu verhindern, dass ein dispatch_block ausgeführt wird, sobald er in seine Warteschlange gesendet wurde, was bedeutet, dass Ihre dispatch_after nicht storniert werden kann. Die einzige Option besteht darin, in Ihrem Block eine Bedingung hinzuzufügen, die zur Laufzeit überprüft werden muss, um die Ausführung zu verhindern. dh.
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, 10 * NSEC_PER_SEC), dispatch_get_main_queue(),^{
if(self.shouldExecuteDispatchBlock)
{ // do your stuff } });
Hmmm, bis das nächste Mal für die Ausführung dieses Blocks auftaucht (und es eingestellt ist, abgebrochen zu werden), ich denke, es würde bis dahin alle Speicher/Objekte hog. Vielleicht ein Problem, wenn Ihre Zyklen wie 60 Minuten sind? :-) – Jonny
Ja und nein. Der Block kopiert den Speicher, was bedeutet, dass wenn Sie auf einen int-Wert in Ihrem Block verweisen, dieser kopiert wird und solange als Block für den Block im Speicher verbleibt. Aber für Objekt, es kopiert sie nicht, es kopiert die Adresse. Wenn Sie ein Bild referenzieren, haben Sie ein UIImage-Objekt im Heap, aber der Block behält nur einen Zeigerwert (8 Bytes in arch64), also kein großes Problem. Natürlich wird das Bild im Speicher behalten, bis der Block erlischt, so dass es nicht durch einen Bogen sauber wird. –
Ich habe dies in eine Erweiterung für DispatchQueue verwandelt: https://github.com/nrbrook/DispatchAfterCancellable – Nick
OK, also mit allen Antworten gesammelt und möglichen Lösungen, scheint die besten für diesen Fall (Erhaltung Einfachheit) rufe performSelector:withObject:afterDelay:
und es mit cancelPreviousPerformRequestsWithTarget:
Ruf, wenn gewünscht. In meinem Fall - kurz vor dem nächsten verzögerte Anrufplanung:
[NSObject cancelPreviousPerformRequestsWithTarget: self selector:@selector(myDelayedMethod) object: self];
[self performSelector:@selector(myDelayedMethod) withObject: self afterDelay: desiredDelay];
Ich habe diesen Pfad gestartet, aber wie macht man das mit Klassenmethoden (weshalb ich zu "dispatch_after" gewechselt habe)? – Olie
@Olie gut eins. Dann müssen Sie diese Anrufe in Instanz umhüllen, oder verwenden Sie Versand + Flag (raten, zweitens wäre einfacher) –
Zu diesem Zweck habe ich diese Klasse:
https://github.com/SebastienThiebaud/dispatch_cancelable_block
Sie anrufen können, a() Funktion deaktivieren, die Ausführung zu widerrufen, was in der Block.
Wenn Sie es in Swift verwenden würden - Sie können es hier https://github.com/katleta3000/CancelBlocks/ – katleta3000
- 1. dispatch_after versus performSelector afterDelay
- 2. dispatch_after gleichwertig in NSOperationQueue
- 3. Meteor - Abbrechen einer Server-Methode vom Client
- 4. Abbrechen von Aufgaben in der Dispose-Methode
- 5. dispatch_after funktioniert nicht in Schleife auf ios
- 6. Python - threading.Timer am Leben bleibt nach Abbrechen() -Methode
- 7. TimePickerDialog: Klicken auf "Abbrechen" -Taste ruft onTimeSet() -Methode
- 8. Abbrechen der Ereignisaufruffolge in der zuvor aufgerufenen Methode
- 9. Abbrechen der Ausführung einer Methode mit aufgerufen aufgerufen
- 10. iPhone: Verwenden von dispatch_after, um NSTimer zu imitieren
- 11. dispatch_after und [UIView Animation: Dauer] passieren sofort (sollten aber nicht)
- 12. Abbrechen Rails DB-Verbindung
- 13. Wie abbrechen/Lesen einer Datei abbrechen - Filereader
- 14. Einen Thread abbrechen?
- 15. Abbrechen BeginInvoke in WPF
- 16. Wie Operation Warteschlange mit einer For-Schleife und Dispatch_after Innen mit einer wachsenden Verzögerung
- 17. Wie zu stoppen/Abbrechen Abfrage abbrechen Schaltfläche von ASP.net Webformular
- 18. JDialog Abbrechen-Taste
- 19. Swift PrepareForSegue Abbrechen
- 20. Abbrechen-Schaltfläche in UISearchController
- 21. Abbrechen jQuery Event-Handling
- 22. DbContextTransaction Transfer abbrechen
- 23. Abbrechen sendSynchronousRequest
- 24. Alarme vom AlarmManager abbrechen
- 25. Verbindungsversuch sofort abbrechen?
- 26. UISearchBar Abbrechen Schaltfläche Farbe?
- 27. Eine Methode aufrufen und abbrechen und zur aufrufenden Methode zurückkehren, wenn sie zu lange dauert
- 28. Erkennungsbefehl im asynchronen BeginExecuteReader abbrechen
- 29. UISearchBar Abbrechen Schaltfläche funktioniert nicht
- 30. Aufgabe nach Zeit abbrechen
yup. scheint, als ob wir Duplikate haben. Frage mich, ob es möglich ist, diese Fragen zusammenzuführen? –