Я в основном пытаюсь реализовать настройку отслеживания достижений в своем приложении.
У меня есть класс 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];
}
}