Dies ist eine Best-Practice-Frage, für die ich keine gute Antwort auf Online finden kann. Ich erstelle eine statische Bibliothek von Code, die unter anderem mehrere Delegate-Methoden für die Fortschrittsrückmeldung bietet.
Die Bibliothek verwaltet ihre eigenen Warteschlangen, also werden Dinge wie Downloads offensichtlich nicht im Hauptthread erledigt, aber meine Frage ist, ob ich sicherstellen soll, dass meine Delegiertenmethoden immer im Hauptthread aufgerufen werden oder es akzeptabel ist, sie von dort aufzurufen Anstehende Threads, die ich verwende? und verlassen sich auf den Entwickler, der die Bibliothek verwendet, um zu überprüfen, ob er im Hauptthread ist, wenn er UI-Aktualisierungen in meinen Delegiertenmethoden durchführen möchte?
Prost, Sam
Sie können es auf jede Art tun; Sie müssen dies nur gut dokumentieren.
Einige APIs rufen Sie im Hauptthread zurück, einige im Thread (oder Runloop), mit dem Sie die Arbeit begonnen haben, und andere geben überhaupt keine Garantie. Einige lassen Sie sogar in einer GCD-Warteschlange passieren, die für alle Rückrufe verwendet wird.
Denken Sie daran, dass der Delegat / Callback für einen nicht unerheblichen Zeitraum blockiert werden könnte. Wenn Ihre API also so schnell wie möglich wieder arbeiten soll, möchten Sie sicherlich einen anderen Thread oder eine andere Warteschlange bereitstellen.
Nachdem Sie all dies gesagt haben, ohne dass die Leistung für Sie oder die Benutzer Ihrer API von entscheidender Bedeutung ist, würde ich mit dem für den Entwickler am bequemsten sein, der der Hauptthread wäre.
Als ich meinen eigenen Download-Manager erstellte, behielt ich die Delegate-Methode beim Aufruf des sekundären Threads, der Verbindungsobjektinstanzen ausführte, aber es war, weil ich einen "Controller" hatte, der Erfolgsblöcke auf dem Hauptthread verschickte. Meiner Meinung nach hängt es davon ab, auf welcher Ebene Ihre Bibliothek beteiligt ist, wenn Sie denken, dass die meisten Delegaten eine Methode mit Unterroutinen aufrufen, die UIKit-Objekte betreffen, da sie nicht threadsicher sind, werde ich sie auf Hauptthread verteilen. Wenn Sie der Meinung sind, dass der Benutzer Ihrer Bibliothek nach dem Delegierten eine weitere Bearbeitung der Daten vornehmen könnte, werde ich entscheiden, in einem anderen Thread zu bleiben, dies jedoch klar in der Dokumentation anzugeben. Es gibt einen anderen Punkt: Geschwindigkeit, abhängig von der Priorität drei könnte ein sekundärer Thread wirklich langsam sein.
[Bearbeiten]
In einem Download-Manager ist KVO oder Notification ein besserer Weg, um Verbindungen zu handhaben, wie Quinn einen Apple Engineer in einem WWDC-Video erklärt.
Offensichtlich müssen Sie delegate-Methoden im Hauptthread aufrufen, denn wenn ich nicht falsch liege, werden Ihre Delegate-Methoden an ein Delegate-Objekt (Benutzerklasse) übergeben.
Angenommen, Sie laden Daten in eine Warteschlange, wenn die Daten heruntergeladen werden, rufen Sie eine Delegate-Methode auf, indem Sie sie an ein bestimmtes Objekt der Benutzerklasse übergeben, also muss sie im Hauptthread sein.
Tags und Links ios grand-central-dispatch queue delegates