1

基本的に、アプリに実績追跡のセットアップを実装しようとしています。

あらゆる種類の統計を追跡するために StatTracker という managedObjectModel クラスがあり、それらの統計が変化したときにアチーブメント追跡クラスに通知して、値と照合してユーザーがアチーブメントを獲得したかどうかを確認できるようにします。

私はKVOを実装しようとしましたが、それを実現するのにかなり近づいていると思いますが、私が直面している問題は次のとおりです:

したがって、appDelegate には、アチーブメント トラッカー クラスの Ivar があり、それをオブザーバーとして、applicationDidFinishLaunching メソッドの statTracker コア データ エンティティのプロパティ値にアタッチします。

AchievementTracker インスタンスで UIAlert をトリガーできたため、接続が確立されていることがわかります。また、StatTracker のプロパティの値が変更されるたびにトリガーされるログ ステートメントをいくつか入れました。ログ ステートメントは、アプリケーションの起動時に 1 回だけ表示されます。

オブジェクトのライフサイクル スキーム全体で何かが欠けているのではないかと思っていますが、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];

     }

}
4

1 に答える 1

1

stattracker への参照を保持する必要があることがわかりました。

于 2010-05-22T15:03:46.720 に答える