Сохранение достижений GKA для сохранения - PullRequest
0 голосов
/ 09 мая 2011

Когда при сообщении о достижении возникает ошибка, я добавляю ее в массив и сохраняю массив в NSUserDefaults. Однако сохраненная информация всегда равна нулю. Как вы правильно сохраняете данные? Я пробовал вызывать сохранение достижений при добавлении, но это ничего не меняет. Я пишу данные, могу увидеть файл, но объект внутри ноль.

- (void)reportAchievementIdentifier:(NSString*)identifier percentComplete:(float)percent
{
    if (self.isGameCenterEnabled) {
        GKAchievement *achievement = [[[GKAchievement alloc] initWithIdentifier:identifier] autorelease];
        if (achievement)
        {
            achievement.percentComplete = percent;
            [achievement reportAchievementWithCompletionHandler:^(NSError *error)
             {
                 if (error != nil)
                 {
                     if (![outstandingAchievementsToReport containsObject:achievement]){
                         [outstandingAchievementsToReport addObject:achievement];
                         [self saveUnsyncedAchievements];
                     }
                 }
             }];
        }
    }
}

- (void)saveUnsyncedAchievements
{  
    NSString *docsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSString *savePath = [docsPath stringByAppendingPathComponent:@"Achievements"];

    // Write to disk    
    if (![NSKeyedArchiver archiveRootObject:outstandingAchievementsToReport toFile:savePath]) {      
        NSLog(@" archiver write failed.");
    } else {
        NSLog(@" archiver write succeeded.");
    }
}

- (void)loadUnsyncedAchievements
{
    NSString *docsPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
    NSString *savePath = [docsPath stringByAppendingPathComponent:@"Achievements"];

    // Read from disk
    outstandingAchievementsToReport = [NSKeyedUnarchiver unarchiveObjectWithFile:savePath];

    NSLog(@"outstandingAchievementsToReport count = %d", [outstandingAchievementsToReport count]);
}

- (void) reportOutstandingAchievements {
    NSLog(@"Report all outstanding achievements.");
    for (GKAchievement *achievement in outstandingAchievementsToReport) {
        [self reportAchievementIdentifier:achievement.identifier percentComplete:achievement.percentComplete];
    }
}

Ответы [ 2 ]

0 голосов
/ 12 апреля 2012

Прочтите этот официальный документальный фильм Apple, как ссылку на класс http://developer.apple.com/library/ios/#documentation/GameKit/Reference/GKAchievement_Ref/Reference/Reference.html

       OR

Вот очень полезный источник из GitHub - в списке TypeOneError http://www.typeoneerror.com/articles/post/game-center-achievement-notification

0 голосов
/ 10 мая 2011

Даже если массив был выделен в init, похоже, что метод reportAchievement решил, что он равен nil. Тестирование на ноль устранило проблему.

- (void)reportAchievementIdentifier:(NSString*)identifier percentComplete:(float)percent
{
    if (self.isGameCenterEnabled) {
        GKAchievement *achievement = [[[GKAchievement alloc] initWithIdentifier:identifier] autorelease];
        if (achievement)
        {
            achievement.percentComplete = percent;
            [achievement reportAchievementWithCompletionHandler:^(NSError *error)
             {
                 if (error != nil)
                 {
                     if (nil == outstandingAchievementsToReport) 
                         outstandingAchievementsToReport = [[NSMutableArray alloc] init];

                     if (![outstandingAchievementsToReport containsObject:achievement]){
                         [outstandingAchievementsToReport addObject:achievement];
                     }
                 }
             }];
        }
    }
}
...