iPhone操作系统:KVO:为什么我的观察者只会在applicationDidfinishLaunching收到通知

时间:2010-05-20 03:08:07

标签: iphone cocoa-touch core-data key-value-observing

我基本上是在我的应用中尝试实现成就跟踪设置。

我有一个名为StatTracker的managedObjectModel类来跟踪所有类型的统计信息,我希望在这些统计信息发生变化时通知我的Achievement跟踪类,以便我可以根据值检查它们,看看用户是否已经获得了成就。

我试图诋毁KVO,我认为我已经接近实现它,但我遇到的问题是:

所以在appDelegate中我有一个Ivar用于我的Achievement跟踪器类,我将它作为观察者附加到applicationDidFinishLaunching方法中我的statTracker核心数据实体的属性值。

我知道它正在建立连接,因为我已经能够在我的AchievementTracker实例中触发UIAlert,并且我已经放置了几个日志语句,只要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];

     }

}

1 个答案:

答案 0 :(得分:1)

结果我需要保留对stattracker的引用。