繁体   English   中英

iPhone操作系统:KVO:为什么我的观察者仅在applicationDidfinishLaunching时得到通知

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM