4

Ich bin auf KVO verkauft, aber wenn es in der offensichtlichen Weise verwendet wird, ist es synchron. Ich würde es gerne in einer Situation verwenden, in der ich viele KVO-Nachrichten in schneller Folge abfeuern würde, was meine App zum Stillstand bringt, während die KVO-Nachrichten behandelt werden. Kann jemand einen Ansatz vorschlagen - vielleicht mit NSOperation oder NSThread - der hier funktioniert?KVO rockt. Nun, wie benutze ich es asynchron?

Mein Ziel ist es, die entkoppelt, Flexibilität der KVO wenn möglich zu halten.

Antwort

0

Auschecken NSNotification. Es ist nicht ganz dasselbe, aber Sie können Benachrichtigungen über Hintergrund-Threads auslösen (mit ein wenig Recherche und Arbeit). Sie können das schöne Entkopplungs- und Feuer-und-Vergessen-Verhalten beibehalten.

+0

Dank Adam. Ja, NSNotification sieht für meinen Bedarf besser aus als KVO. Prost. – dugla

+0

Es ist jetzt sehr einfach, KVO asynchron mit GCD (Grand Central Dispatch) zu verwenden. NSNotification bietet viel weniger Flexibilität als KVO und ist in vielen Fällen kein effektiver Ersatz. – mjmdavis

13

KVO ist von Natur aus einzelnen Gewinden, daß die KVO-Benachrichtigungen auf demselben Thread als Änderung bricht.

Natürlich UIKit und Cocoa beide wirklich nur wollen Sie UI-Elemente auf dem Hauptthread sein diddling.

Wenn Sie also asynchrone Operationen ausführen, verwenden Sie höchstwahrscheinlich Threads, und wenn ja, haben Sie bereits ein Synchronisationsproblem, bei dem Sie die Benachrichtigungen von einem Thread zum Hauptthread abrufen müssen.

Und darin liegt der Schlüssel. Anstatt jede Änderungsbenachrichtigung blind zu übermitteln, können Sie die Änderungsbenachrichtigungen zusammenführen, bevor Sie sie an den Hauptthread weiterleiten.

Es gibt eine Vielzahl von Mitteln, über die Sie dies tun können. Die spezifische Lösung wird sehr wahrscheinlich für Ihre Anwendung ziemlich einzigartig sein.

Persönlich versuche ich coalesce-and-forward feinkörniger Operationen zu vermeiden. Ich finde es viel einfacher, dem Hauptthread zu sagen, dass sich ein bestimmter Untergraph von Objekten geändert hat. Es ist wahrscheinlicher, dass der Zeichnungscode, der dann die Änderungen für den Benutzer sichtbar macht, den zugehörigen Zustand neu zeichnen muss und somit die damit verbundenen Änderungen automatisch widergespiegelt werden.

Der Schlüssel, wie Sie vermuten, besteht darin, die Benachrichtigungen zu drosseln, damit Sie die Reaktionszeit der App nicht beeinträchtigen (oder die Akkulaufzeit des Geräts zerstören).

+0

BBUM, Dank. Nur um ein bisschen mehr zu erarbeiten. Ich mache eine Grafik-App. mit viel klopfen, Sound f/x und Visuals die ganze Zeit passiert. Mein Plan ist, sich stark auf KVO zu verlassen, um Sound f/x basierend auf einem bestimmten Verhalten auszulösen. Die Trigger-Sounds können schnell und wütend und jeder kann für mehr als eine Sekunde spielen. Würden Sie empfehlen, KVO aufzugeben und nur eine NSOperation-Instanz für den gleichzeitigen - nicht blockierenden Sound f/x zu erstellen? Cheers, Doug – dugla