4

Je suis vendu sur KVO mais s'il est utilisé de manière évidente, il est synchrone. Je voudrais l'utiliser dans une situation où je déclenche de nombreux messages du KVO en succession rapide et cela provoque l'arrêt de mon application lorsque les messages du KVO sont traités. Quelqu'un peut-il suggérer une approche - peut-être en utilisant NSOperation ou NSThread - cela fonctionnera ici?Roches du KVO. Maintenant, comment l'utiliser de manière asynchrone?

Mon objectif est de conserver la flexibilité découplée de KVO si possible.

Répondre

0

Découvrez NSNotification. Ce n'est pas tout à fait la même chose, mais vous pouvez déclencher des notifications sur les threads de fond (avec un peu de recherche et de travail). Vous pouvez maintenir le bon comportement de découplage et d'incendie et d'oubli.

+0

Merci Adam. Oui, NSNotification a l'air mieux adapté que KVO pour mes besoins. À votre santé. – dugla

+0

Il est maintenant assez facile d'utiliser KVO de manière asynchrone avec GCD (Grand Central Dispatch). NSNotification offre beaucoup moins de flexibilité que KVO et pourrait ne pas être un remplacement efficace dans de nombreux cas. – mjmdavis

13

KVO est intrinsèquement un thread unique en ce que les notifications KVO seront livrées sur le même thread que la modification.

Bien sûr, UIKit et Cocoa ne veulent tous les deux que vous faire glisser des éléments d'interface utilisateur sur le thread principal. Par conséquent, si vous effectuez des opérations asynchrones, vous utilisez très probablement des threads et, si tel est le cas, vous avez déjà un problème de synchronisation en ce sens que vous devez récupérer les notifs d'un thread dans le thread principal.

Et c'est là que réside la clé. Au lieu de transmettre aveuglément chaque notification de modification au fur et à mesure, vous pouvez fusionner les notifications de modification avant de les transmettre au thread principal.

Il y a une variété de moyens par lesquels vous pouvez faire ceci. La solution spécifique va être tout à fait unique à votre application, très probablement. Personnellement, j'essaie d'éviter la coalescence et la progression des opérations à grain fin. Je trouve beaucoup plus simple de dire au fil conducteur qu'un sous-graphe particulier d'objets a changé. Plus probablement qu'autrement, le code de dessin qui rendra les changements visibles à l'utilisateur aura besoin de redessiner l'état connexe et, par conséquent, les changements liés seront automatiquement reflétés. La clé, comme vous l'avez supposé, est d'étrangler les notifications pour ne pas ralentir la réactivité de l'application (ou détruire la durée de vie de la batterie des périphériques).

+0

bbum, Merci. Juste pour élaborer un peu plus. Je fais une application graphique. avec beaucoup de tapotements, son f/x, et des visuels qui se passent tout le temps. Mon plan est de s'appuyer fortement sur KVO pour déclencher le son f/x basé sur un comportement particulier. Les sons déclencheurs peuvent être rapides et furieux et chacun peut jouer pendant plus d'une seconde. Recommanderiez-vous d'abandonner KVO et de simplement créer une instance de NSOperation pour le son concurrent non-bloquant f/x? À votre santé, Doug – dugla

Questions connexes