我基本上是在尝试在我的应用程序中实现成就跟踪设置。
我有一个名为 StatTracker 的 managedObjectModel 类来跟踪各种统计信息,我希望在这些统计信息发生更改时通知我的成就跟踪类,以便我可以根据值检查它们并查看用户是否获得了成就。
我试图暗示 KVO,我认为我已经接近实现它,但我遇到的问题是:
因此,在 appDelegate 中,我的成就跟踪器类有一个 Ivar,我将它作为观察者附加到 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];
}
和我的成就追踪器:
- (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];
}
}