2016-06-29 6 views
0

Я понимаю, что это может быть дублированный вопрос, но когда я попытался, я не получаю измененные свойства. Я последовал за двумя ответами KVO + Array SO. Однако я по-прежнему не хватает некоторых бит, поскольку он не работает в моем случае.KVO на изменяемом массиве свойств настраиваемых объектов

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: Здесь я хочу обновить местоположение пользователя на карте ,

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); 
    } 
} 

Здесь я получаю законченный объект пользователя, а не измененные/обновленные свойства. Я что-то делаю неправильно?

+1

Кажется, что это работает, проверьте документацию KVO. –

ответ

0

Как @ A-Живой упомянул свою работу, как и ожидалось. В реальном коде был тип, которого нет здесь.

0

Как насчет, если вы измените ваш код станет для:

[self willChangeValueForKey:@"remoteUsers"]; 
rmtUser.latitude = user.latitude; 
rmtUser.longitude = user.longitude; 
[self didChangeValueForKey:@"remoteUsers"]; 
Смежные вопросы