iPhone OS:KVO:为什么我的观察者只在ApplicationIDFinishLaunching时收到通知

iPhone OS:KVO:为什么我的观察者只在ApplicationIDFinishLaunching时收到通知,iphone,cocoa-touch,core-data,key-value-observing,Iphone,Cocoa Touch,Core Data,Key Value Observing,我基本上是想在我的应用程序中实现一个成就跟踪设置 我有一个名为StatTracker的managedObjectModel类来跟踪各种统计数据,我希望在这些统计数据发生变化时通知我的成就跟踪类,这样我就可以对照一个值检查它们,看看用户是否获得了成就 我曾尝试实现KVO,我认为我很快就能实现它,但我遇到的问题是: 因此,在appDelegate中,我有一个用于成就跟踪器类的Ivar,我将其作为观察者附加到ApplicationIDFinishLaunching方法中statTracker核心数据实

我基本上是想在我的应用程序中实现一个成就跟踪设置

我有一个名为StatTracker的managedObjectModel类来跟踪各种统计数据,我希望在这些统计数据发生变化时通知我的成就跟踪类,这样我就可以对照一个值检查它们,看看用户是否获得了成就

我曾尝试实现KVO,我认为我很快就能实现它,但我遇到的问题是:

因此,在appDelegate中,我有一个用于成就跟踪器类的Ivar,我将其作为观察者附加到ApplicationIDFinishLaunching方法中statTracker核心数据实体的属性值

我知道它正在建立连接,因为我已经能够在AchievementTracker实例中触发UIAlert,并且我已经放置了几个日志语句,只要StatTracker属性上的值发生更改,就应该触发这些语句。log语句仅在应用程序启动时出现一次

我想知道我是否在整个对象生命周期方案中遗漏了一些东西,我只是不明白为什么在ApplicationIDFinishLaunching方法运行后,观察者不再收到更改通知。它是否与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];

     }

}

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

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

我将成就跟踪器右移到CoreDataSingleton中,这是同一件事,我还移动了addObserver消息以在viewControllers viewDidLoad方法中调用相同的事情。我注意到的一件事是在事物的观察者端—(void)observeValueForKeyPath:(NSString*)对象的键路径:(id)对象更改:(NSDictionary*)更改上下文:(void*)上下文的“object”参数{当我将'object'打印到控制台时,它会将其作为statTracker列出,但它的所有属性的值都是'nil'。有什么想法吗?我将成就跟踪器直接移动到CoreDataSingleton中,这是同一件事,我还移动了addObserver消息,以便在viewControllers viewDidLoad方法中调用。一我注意到的是在事物的观察者端——(void)observeValueForKeyPath:(NSString*)对象的键路径:(id)对象更改:(NSDictionary*)更改上下文:(void*)上下文{当我将“object”打印到控制台时,它会将其作为statTracker列出,但它所有属性的值都是“nil”。有什么想法吗?