2010-05-20 2 views
1

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

    } 

} 
+0

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

ответ

1

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