iPhone OS: KVO: почему мой Observer получает уведомление только при запуске applicationDidfinishLaunching

Я в основном пытаюсь реализовать настройку отслеживания достижений в своем приложении.

У меня есть класс manageObjectModel под названием StatTracker для отслеживания всех видов статистики, и я хочу, чтобы мой класс отслеживания достижений уведомлялся об изменении этой статистики, чтобы я мог сравнить их со значением и посмотреть, заработал ли пользователь достижение.

Я пытался внедрить KVO, и я думаю, что довольно близок к тому, чтобы это произошло, но проблема, с которой я сталкиваюсь, заключается в следующем:

Итак, в appDelegate у меня есть Ivar для моего класса отслеживания достижений, я присоединяю его в качестве наблюдателя к значению свойства моего основного объекта данных statTracker в методе applicationDidFinishLaunching.

Я знаю, что это устанавливает соединение, потому что мне удалось вызвать UIAlert в моем экземпляре AchievementTracker, и я поместил несколько операторов журнала, которые должны запускаться всякий раз, когда изменяется значение свойства StatTracker. оператор журнала появляется только один раз при запуске приложения.

Мне интересно, не упустил ли я что-то во всей схеме жизненного цикла объекта, я просто не понимаю, почему наблюдатель перестает получать уведомления об изменениях после запуска метода applicationDidFinishLaunching. Это как-то связано с областью действия ссылки на AchievementTracker или, что более вероятно, ссылка на мои основные данные StatTracker исчезнет, ​​как только этот метод завершится.

Думаю, я не уверен, что это правильное место для их размещения, если это так. Хотелось бы помощи. Вот код, в котором я добавляю наблюдателя в свой метод appDidFinishLaunching:

 [[CoreDataSingleton sharedCoreDataSingleton] incrementStatTrackerStat:@"timesLaunched"];

achievementsObserver = [[AchievementTracker alloc] init];
    StatTracker *object = nil;
object = [[[CoreDataSingleton sharedCoreDataSingleton] getStatTracker] objectAtIndex:0];
NSLog(@"%@",[object description]);
[[CoreDataSingleton sharedCoreDataSingleton] addObserver:achievementsObserver toStat:@"refreshCount"];

вот код в моем синглтоне основных данных:

-(void) addObserver:(id)observer  toStat:(NSString *) statToObserve {

NSLog(@"observer added");
NSArray *array = [[NSArray alloc] init];
array = [self getStatTracker];
[[array objectAtIndex:0] addObserver:observer forKeyPath:statToObserve options:NSKeyValueObservingOptionNew | NSKeyValueObservingOptionOld context:NULL];

}

и мой трекер достижений:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
NSLog(@"achievemnt hit");
//NSLog("%@", [change description]);

     if ([keyPath isEqual:@"refreshCount"] && ((NSInteger)[change valueForKey:@"NSKeyValueObservingOptionOld"] == 60) ) { 
NSLog(@"achievemnt hit inside");
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"title" message:@"achievement unlocked" delegate:self cancelButtonTitle:@"cancel" otherButtonTitles:nil];
    [alert show];

     }

}

person nickthedude    schedule 20.05.2010    source источник
comment
Я переместил трекер достижений прямо в CoreDataSingleton, и это то же самое, я также переместил сообщение addObserver, которое будет вызываться в методе viewControllers viewDidLoad, то же самое. Одна вещь, которую я заметил, это то, что в конце наблюдателя аргумент «объект» - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { when Я вывожу «объект» в консоль, он перечисляет его как statTracker, как и должно быть, но значения всех его свойств равны «нолю». Любые идеи?   -  person nickthedude    schedule 20.05.2010


Ответы (1)


оказывается, мне нужно было сохранить ссылку на stattracker.

person nickthedude    schedule 22.05.2010