Une des idées fausses courantes sur le SDK iPhone est qu'il ne supporte pas les clés-valeur d'observation, ou KVO. Je soupçonne que la raison de cette idée fausse est que les usages les plus remarquables de KVO à Cocoa-Core de données et liaisons-n'a pas été porté à l'iPhone.
Maintenant, KVO n'est pas beaucoup utilisée dans le SDK de l'iPhone. Je ne pense pas que nous ayons jamais fait mention dans le livre. Mais il est disponible. Le protocole NSKeyValueObservation informelle fait partie du SDK de l'iPhone. C'est complètement l'opt-in sur l'iPhone, cependant. Lorsque vous créez un projet d'application dans Xcode, aucun de vos objets sont en observant les autres. Eh bien, il pourrait y avoir une certaine KVO être utilisé dans les coulisses (en fait, je soupçonne qu'il ya), mais la plupart des gens ne le rencontre.
Mais, tout objet Objective-C peuvent s'inscrire pour recevoir des notifications quand une propriété d'un autre objet est modifiée. Un objet peut même se respecter. Voilà comment vous vous inscrivez pour observer un objet. Dans cet exemple, monObjet est dit de notifier theObserver tout moment la propriété appelée nom de
Maintenant, theObserver vient de mettre en œuvre cette méthode pour savoir quand les changements theObject.name:
C'est vraiment un peu flexible de fonctionnalités. Lors de l'inscription en tant qu'observateur, vous pouvez utiliser les options: l'argument de dire au système KVO si vous voulez l'ancienne valeur, la nouvelle valeur, ou la valeur d'origine de la propriété d'être changé. Vous pouvez même utiliser keypaths, et pas seulement les touches. Donc, si le nom n'était pas une chaîne, mais étaient en fait un autre objet avec les propriétés composant appelé firstName et lastName, nous pourrions passer dans un chemin de clé de @ "name.firstName" pour indiquer que nous voulons pour être averti quand la propriété firstName des changements de nom.
C'est des trucs assez cool. J'ai utilisé cette fonctionnalité récemment dans SQLitePersistentObjects pour définir l'indicateur sales sur les objets de sorte qu'ils ne sont sauvés quand quelque chose a changé depuis qu'il a été chargé, ou la dernière fois qu'il a été sauvé. Dans la méthode init, j'ai simplement itérer sur les propriétés de l'objet (y compris celles déclarées dans la superclasse), et pour tout bien qui n'est pas en lecture seule, je l'enregistrer en tant qu'observateur de lui-même. Puis, quand l'objet est avisé de tout changement, je marque l'objet comme sale, ce qui me permet de savoir à fait d'enregistrer les données lorsque la méthode de sauvegarde est appelée.
Dans l'avenir, je peut mettre en œuvre une version plus sophistiquée qui met à jour uniquement les propriétés réelles qui sont sales plutôt que de sauver tout l'objet.
Maintenant, KVO n'est pas beaucoup utilisée dans le SDK de l'iPhone. Je ne pense pas que nous ayons jamais fait mention dans le livre. Mais il est disponible. Le protocole NSKeyValueObservation informelle fait partie du SDK de l'iPhone. C'est complètement l'opt-in sur l'iPhone, cependant. Lorsque vous créez un projet d'application dans Xcode, aucun de vos objets sont en observant les autres. Eh bien, il pourrait y avoir une certaine KVO être utilisé dans les coulisses (en fait, je soupçonne qu'il ya), mais la plupart des gens ne le rencontre.
Mais, tout objet Objective-C peuvent s'inscrire pour recevoir des notifications quand une propriété d'un autre objet est modifiée. Un objet peut même se respecter. Voilà comment vous vous inscrivez pour observer un objet. Dans cet exemple, monObjet est dit de notifier theObserver tout moment la propriété appelée nom de
[theObject addObserver:theObserver forKeyPath:@"name" options:0 context:nil];Maintenant, theObserver vient de mettre en œuvre cette méthode pour savoir quand les changements theObject.name:
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
}C'est vraiment un peu flexible de fonctionnalités. Lors de l'inscription en tant qu'observateur, vous pouvez utiliser les options: l'argument de dire au système KVO si vous voulez l'ancienne valeur, la nouvelle valeur, ou la valeur d'origine de la propriété d'être changé. Vous pouvez même utiliser keypaths, et pas seulement les touches. Donc, si le nom n'était pas une chaîne, mais étaient en fait un autre objet avec les propriétés composant appelé firstName et lastName, nous pourrions passer dans un chemin de clé de @ "name.firstName" pour indiquer que nous voulons pour être averti quand la propriété firstName des changements de nom.
C'est des trucs assez cool. J'ai utilisé cette fonctionnalité récemment dans SQLitePersistentObjects pour définir l'indicateur sales sur les objets de sorte qu'ils ne sont sauvés quand quelque chose a changé depuis qu'il a été chargé, ou la dernière fois qu'il a été sauvé. Dans la méthode init, j'ai simplement itérer sur les propriétés de l'objet (y compris celles déclarées dans la superclasse), et pour tout bien qui n'est pas en lecture seule, je l'enregistrer en tant qu'observateur de lui-même. Puis, quand l'objet est avisé de tout changement, je marque l'objet comme sale, ce qui me permet de savoir à fait d'enregistrer les données lorsque la méthode de sauvegarde est appelée.
Dans l'avenir, je peut mettre en œuvre une version plus sophistiquée qui met à jour uniquement les propriétés réelles qui sont sales plutôt que de sauver tout l'objet.
Aucun commentaire:
Enregistrer un commentaire