Я в основном пытаюсь реализовать настройку отслеживания достижений в своем приложении.iPhone OS: KVO: Почему мой наблюдатель только получает уведомление в applicationDidfinishLaunching
У меня есть класс managedObjectModel, называемый StatTracker, чтобы отслеживать все виды статистики, и я хочу, чтобы мой класс отслеживания достижений был уведомлен о том, когда эти статистические данные меняются, поэтому я могу проверить их на величину и посмотреть, достиг ли пользователь достижения ,
Я пытался impliment КВО, и я думаю, что я довольно близко, чтобы сделать это случилось, но проблема я бегу в это:
Так в AppDelegate я есть Ивар для моего Achievement трекера class, я прикрепляю его как наблюдателя к значению свойства моего основного объекта данных 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];
}
}
Я переместил трекер Achievement прямо в CoreDataSingleton, и это то же самое, я также переместил сообщение addObserver, которое вызывается в методе viewControllers viewDidLoad. Одна вещь, которую я заметил, находится на конце наблюдателя в аргументе объекта «объект» - (void) observValueForKeyPath: (NSString *) keyPath ofObject: (id) изменение объекта: (NSDictionary *) изменить контекст: (void *) context {when Я печатаю «объект» на консоль, он перечисляет его как statTracker, как и должно, но значения всех его свойств - все «ноль». есть идеи? – nickthedude