在报告成就期间遇到错误时,我将其添加到数组中,然后将数组保存到NSUserDefaults。但是,保存的信息总是为零。你如何妥善保留数据?我尝试在添加时调用retain成就,但这并没有改变任何东西。我写的数据,可以看到文件,但里面的对象是零。
- (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];
}
}
答案 0 :(得分:0)
尽管数组是在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];
}
}
}];
}
}
}
答案 1 :(得分:0)
阅读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