2013-07-05 3 views
8

Dies ist eine "Best Practice" -Frage. Ich kann keine gute Antwort für Online finden. Ich erstelle eine statische Code-Bibliothek, die unter anderem mehrere Delegate-Methoden für Fortschritts-Feedback bietet.Sollten meine iOS-Delegiertenmethoden immer im Hauptthread zurückgegeben werden?

Die Bibliothek verwaltet ihre eigenen Warteschlangen, also werden Dinge wie Downloads offensichtlich nicht im Hauptthread erledigt, aber meine Frage ist, sollte ich sicherstellen, dass meine Delegiertenmethoden immer am Hauptthread aufgerufen werden oder es akzeptabel ist, sie aufzurufen die warteschlangen Threads, die ich verwende? und sich auf den Entwickler verlassen, der die Bibliothek verwendet, um zu überprüfen, ob er im Hauptthread ist, wenn er UI-Aktualisierungen in meinen Delegate-Methoden durchführen möchte?

Cheers, Sam

Antwort

3

Sie können es in beide Richtungen tun; Sie müssen dies nur gut dokumentieren.

Einige APIs rufen Sie im Hauptthread zurück, einige im Thread (oder Runloop), den Sie zum Starten der Arbeit verwendet haben, und andere geben überhaupt keine Garantien ab. 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 eine nicht-triviale Zeitspanne 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 Warteschlange versenden.

Nachdem dies alles gesagt wurde, wenn die Leistung für Sie oder die Benutzer Ihrer API nicht kritisch ist, würde ich mit dem bequemsten für den Entwickler gehen, der der Hauptthread wäre.

+0

Vielen Dank für Ihre Antwort, es scheint, dass "Best Practice" in diesem Fall wirklich vom Szenario abhängt. – Sammio2

+1

Es kommt darauf an. Aber ich würde empfehlen, immer eine "interne private" Warteschlange für die Ausführung der Client-Blöcke zu verwenden. Dies ist die einzige zuverlässige Möglichkeit, um versehentliches Sperren durch den Benutzercode zu vermeiden, wenn er irgendwo im Block eine dispatch_sync() -Aufforderung aufruft. – CouchDeveloper

+0

Danke, ja, ich benutze interne private Warteschlangen in der Bibliothek. – Sammio2

-1

Offensichtlich haben Sie Delegatmethoden in Haupt-Thread zu nennen, denn wenn ich nicht falsch bin, wird Ihre Delegatmethoden zu einem gewissen Delegatobjekt übergeben werden (Benutzer-Klasse).

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 Klasse des Benutzers übergeben, also muss es im Haupt-Thread sein.

+0

Wenn Sie "offensichtlich" sagen ... Warum ist es offensichtlich? Die Delegate-Methoden werden auch dann ordnungsgemäß an das Delegatobjekt zurückgegeben, wenn sie sich nicht im Hauptthread befinden. Es bedeutet lediglich, dass die Klasse des Benutzers sicherstellen muss, dass sie im Hauptthread ausgeführt wird, wenn sie die Benutzeroberfläche aktualisieren möchte. (FYI, ich war es nicht, wer Ihre Antwort downvoted!) – Sammio2

+0

Ich meinte, wenn Sie es für Benutzer verlassen, dann macht es Benutzer durch Ihre Bibliothek Code zu wissen, ob er auf Haupt-Thread oder andere aufrufen sollte. – Deepak

+0

Obwohl ich kein Genie bin, aber was auch immer meine Erfahrung ist, sollten Sie die Benutzer mit dieser Bibliothek einfach arbeiten lassen (und ich habe Ihre Frage aufgefrischt, ich warte auch auf andere Antwort, Guter Punkt, die Sie angesprochen haben). – Deepak

0

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.
[EDIT]
In einem Download-Manager KVO oder Benachrichtigung ist eine bessere Möglichkeit, Verbindungen zu behandeln, wie von Quinn ein Apple Engineer in einem WWDC-Video angegeben.

+0

Danke für Ihre Kommentare ... Erstens ist Quinn eine Legende! Zweitens, das Problem, das ich habe, ist, dass meine Bibliothek weit mehr als nur als Download-Manager fungiert, in der Tat der Download-Manager ist eine Komponente innerhalb der Bibliothek. Also wollte ich KVO/Benachrichtigungen für einen Aspekt vermeiden und Methoden für einen anderen delegieren ... Aber ansonsten ja, ich würde dir zustimmen. – Sammio2

+0

Ja "Der Eskimo" ist ein Superheld, er ist wirklich ein netter Kerl, erkläre immer Sachen. – Andrea