![](/img/trans.png)
[英]Stop applicationDidFinishLaunching method from getting called + iPhone
[英]iPhone OS: KVO: Why is my Observer only getting notified at applicationDidfinishLaunching
我基本上是在尝试在我的应用中实施成就跟踪设置。
我有一个称为StatTracker的managedObjectModel类,用于跟踪各种统计信息,我希望在这些统计信息发生变化时通知我的Achievement跟踪类,以便我可以根据一个值检查它们并查看用户是否获得了成就。
我试图暗示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];
}
和我的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];
}
}
原来我需要保留对stattracker的引用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.