2010-05-20 6 views
1

Je suis en train d'essayer de mettre en place une configuration de suivi des performances dans mon application. J'ai une classe managedObjectModel appelée StatTracker pour garder une trace de toutes sortes de statistiques et je veux que ma classe de suivi Achievement soit notifiée lorsque ces statistiques changent afin que je puisse les comparer à une valeur et voir si l'utilisateur a gagné un exploit .iPhone OS: KVO: Pourquoi mon observateur n'est-il averti que par applicationDidfinishLaunching

J'ai essayé de impliment KVO et je pense que je suis assez proche de la faire advenir, mais le problème que je suis en cours d'exécution en est la suivante:

Ainsi, dans le appDelegate j'ai un Ivar pour mon suivi des réalisations class, je l'attache en tant qu'observateur à une valeur de propriété de mon entité de données de base statTracker dans la méthode applicationDidFinishLaunching.

Je connais sa connexion parce que j'ai été capable de déclencher un UIAlert dans mon instance AchievementTracker, et j'ai mis plusieurs instructions de journal qui devraient être déclenchées chaque fois que la valeur de la propriété de StatTracker change. l'instruction de journal n'apparaît qu'une seule fois au lancement de l'application. Je me demande s'il me manque quelque chose dans tout le cycle de vie de l'objet, je ne comprends pas pourquoi l'observateur cesse d'être averti des changements après l'exécution de la méthode applicationDidFinishLaunching. Cela a-t-il quelque chose à voir avec la portée de la référence AchievementTracker ou plus probablement la référence à mes données de base StatTracker disparaît une fois que cette méthode a fini.

Je suppose que je ne suis pas sûr du bon endroit pour placer ceux-ci si c'est le cas. J'adorerais de l'aide. Voici le code où j'ajoute l'observateur dans ma méthode de 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"]; 

ici est le code dans mes données de base singleton:

-(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]; 

}

et mon 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]; 

    } 

} 
+0

J'ai déplacé le tracker Achievement directement dans le CoreDataSingleton et c'est la même chose, j'ai également déplacé le message addObserver à appeler dans la méthode viewControllers viewDidLoad même chose. Une chose que j'ai remarquée est l'argument 'object' de - (void) observeValueForKeyPath: (NSString *) keyPath ofObject: (id) changement d'objet: (NSDictionary *) change de contexte: (void *) context {when J'imprime 'objet' sur la console, il le répertorie comme un statTracker comme il se doit, mais les valeurs de toutes ses propriétés sont toutes 'nul'. des idées? – nickthedude

Répondre

1

Il s'avère que j'avais besoin de conserver la référence au stattracker.

Questions connexes