2016-06-29 8 views
0

Ich verstehe, dass es eine doppelte Frage sein kann, aber wenn ich es versuchte, bekomme ich nicht die geänderten Eigenschaften. Ich folgte ein paar Antworten von KVO + Array SO. Allerdings fehlen mir noch einige Bits, da es in meinem Fall nicht funktioniert.KVO auf veränderbare Array von benutzerdefinierten Objekten Eigenschaften

User.h:

@interface User : NSObject 
... 
@property(nonatomic, assign) double latitude; 
@property(nonatomic, assign) double longitude; 
... 
@end 

SingletonClass.h:

@interface SingletonClass : NSObject 
.... 
@property(nonatomic, readonly) NSMutableArray *remoteUsers;//Stores user objects 
... 
@end 

SingletonClass.m

@implementation SingletonClass 

for (int i = 0; i < _remoteUsers.count; i++) { 
      index = [NSIndexSet indexSetWithIndex:i]; 
      User *rmtUser = _remoteUsers[i]; 
      if ([rmtUser.roomJid isEqualToString:occupantJID.description]) { 
       [self willChange:NSKeyValueChangeReplacement valuesAtIndexes:index forKey:@"remoteUsers"]; 
       rmtUser.latitude = user.latitude; 
       rmtUser.longitude = user.longitude; 
       [self didChange:NSKeyValueChangeReplacement valuesAtIndexes:index forKey:@"remoteUsers"]; 
       isUserInList = YES; 
       break; 
      } 
     } 

MainViewClass.h: Hier habe ich die Benutzer-Standort auf der Karte aktualisieren möchten .

MainViewClass.m:

@implementation MainViewClass 
.... 
[SingletonClass addObserver:self forKeyPath:@"remoteUsers" options:NSKeyValueObservingOptionNew context:nil]; 
.... 

-(void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context 
{ 
    if([keyPath isEqualToString:@"remoteUsers"]) { 
     User *remoteUser = ((SingletonClass *)object).remoteUsers[0]; 
     NSLog(@"THE LATITUDE OBSERVED IS %f", remoteUser.latitude); 
     NSLog(@"THE LONGITUDE OBSERVED IS %f", remoteUser.longitude); 
    } 
} 

Hier bin ich immer das komplette Benutzerobjekt stattdessen die geänderten/aktualisierten Eigenschaften. Tue ich es irgendwo falsch?

+1

Scheint wie beabsichtigt zu funktionieren, überprüfen Sie die Dokumentation von KVO. –

Antwort

0

Als @ A-Live erwähnt wie erwartet seine Arbeiten. Es gab einen Typ im echten Code, der hier nicht in der Post ist.

0

Wie wäre es, wenn Sie Ihren Code zu werden ändern:

[self willChangeValueForKey:@"remoteUsers"]; 
rmtUser.latitude = user.latitude; 
rmtUser.longitude = user.longitude; 
[self didChangeValueForKey:@"remoteUsers"];