2011-01-22 13 views
7

Ho bisogno di aiuto per cercare di capire KVO su una gerarchia di oggetti complessa. Lasciami impostare lo scenario. L'oggetto MyClass ha una proprietà di matrice mutabile che contiene oggetti MyPerson. Voglio osservare i cambiamenti nella proprietà myPeople di MyClass. Inoltre vorrei osservare tutte le proprietà contenute nell'oggetto MyPerson. Ecco le definizioni di classe.Come implementare l'osservazione dei valori chiave degli oggetti in un NSMutableArray

@interface MyClass:NSObject 
{ 
    NSMutableArray *myPeople; 
} 

@property(nonatomic, retain)NSMutableArray *myArray; 

@end 

Ecco l'oggetto myPerson,

@interface MyPerson:NSObject 
{ 
    NSString *myName; 
    NSString *myLastName; 
} 

@property(nonatomic, retain)NSString *myName; 
@property(nonatomic, retain)NSString *myLastName; 

@end 

è corretto osservare le proprietà che mi interessano nel seguente modo?

MyClass *myClass = [[MyClass alloc] init]; //myPeople is filled with myPerson objects 

MySchool *mySchool = [[MySchool alloc] init]; 

[myClass addObserver:mySchool 
     forKeyPath:@"myPeople" 
      options:NSKeyValueObservingOptionNew 
     context:NULL]; 

[myClass addObserver:mySchool 
     forKeyPath:@"myPeople.myName" 
      options:NSKeyValueObservingOptionNew 
     context:NULL]; //I am unsure about this one 

[myClass addObserver:mySchool 
     forKeyPath:@"myPeople.myLastName" 
      options:NSKeyValueObservingOptionNew 
     context:NULL]; //I am unsure about this one 

risposta

7

No, non è corretto. Dovresti osservare le proprietà per ogni oggetto che aggiungi all'array separatamente. Quindi, ogni volta che un oggetto viene aggiunto o rimosso dalla matrice, è necessario aggiungere/rimuovere l'osservatore da/per gli oggetti aggiunti/rimossi.

+0

Grazie per la rapida risposta. Cosa succede se gli oggetti nell'array erano dizionari (NSDictionary). Questo metodo funzionerebbe? – David

+0

Non cambierebbe nulla. È possibile specificare "NSKeyValueChangeInsertion", "NSKeyValueChangeRemoval" o "NSKeyValueChangeReplacement" sul proprio osservatore di array per essere notificati delle modifiche alla matrice stessa, ma non c'è modo di essere avvisati automaticamente delle modifiche ai contenuti dell'array. –

+0

Grazie capisco ora. – David

Problemi correlati