Я в основном пытаюсь реализовать настройку отслеживания достижений в своем приложении.
У меня есть класс managedObjectModel, называемый StatTracker, для отслеживания всех видов статистики, и я хочу, чтобы мой класс отслеживания достижений уведомлялся об изменении этой статистики, чтобы я мог проверить их по значению и посмотреть, заработал ли пользователь достижение.
Я пытался повлиять на KVO, и я думаю, что я довольно близок к тому, чтобы это произошло, но проблема, с которой я сталкиваюсь, заключается в следующем:
Итак, в appDelegate у меня есть Ivar для моего класса трекера Achievement, я присоединяю его в качестве наблюдателя к значению свойства моего основного объекта данных 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];
}
и мой AchievementTracker:
- (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];
}
}