0

我有一个带有NSMutableArray实现NSCoding协议的自定义 Cocos2d 对象的类。

@interface PlayerData : NSObject <NSCoding> {
}

@property (readwrite, nonatomic) NSMutableArray *levelsStars; //Where levelsStars is filled with objects conforming to the NSCoding protocol.

对象是 type LevelData,它继承自CCNode(一个 Cocos2d 类)并符合NSCoding协议。

@interface LevelData : CCNode <NSCoding>

下面是协议的实现PlayerData。为了对NSMutableArray符合NSCoding对象的自定义 Cocos2d 对象进行编码和解码:

-(void) encodeWithCoder:(NSCoder *)aCoder
{
    [aCoder encodeObject:[NSKeyedArchiver archivedDataWithRootObject:levelsStars] forKey:kLevelsStars];
}


-(id) initWithCoder:(NSCoder *)aDecoder
{
    self = [super init];
    if (self) {
        //Reading arrays:
        NSData * dataRepresentingLevelStars = [aDecoder decodeObjectForKey:kLevelsStars];
        if (dataRepresentingLevelStars!=nil) {
            NSArray * oldSavedArray = [NSKeyedUnarchiver unarchiveObjectWithData:dataRepresentingLevelStars];
            if (dataRepresentingLevelStars!=nil) {
                levelsStars = [NSMutableArray arrayWithArray:oldSavedArray];
            }
            else
            {
                levelsStars = [[NSMutableArray array] initWithCapacity:10];
            }
        }

    }

    return self;
}

这种方法正确吗?我基于这个问题/答案

编辑:我想我会在我的用例中添加更多细节

我的用户可以在不同的角色中进行选择,每个角色对应一个 PlayerData 对象,我计划将其存储在不同的文件中,并附加用户的游戏中心 ID(id-character1.archive、id-character2.archive 等)。

我确实保存了对象中字符的进度(例如分数、生命),包括 Cocos2d 对象的 NSMutableArray 自定义数组(在我的真实案例中,我确实有 5 个不同的数组,每个数组包含 20/30 个对象)。

4

1 回答 1

0

在您想要取消归档的 PlayerData 对象的主要 init 方法中:

- (id)init {
    self = [super init];
    if (self) {
        self.levelsStars = [NSKeyedUnarchiver unarchiveObjectWithFile:pathToArchive];
        if (self.levelsStars == nil) self.levelsStars = [NSMutableArray array];
    }
}

然后,这将在数组中的每个对象上调用 initWithCoder:。并将它们拉回一个可变数组中。

不过,您将希望有一些方法来保存您的数据,同样在您的 PlayerData 对象上:

- (void)applicationDidEnterBackground:(NSNotification *)notification {
    [NSKeyedArchiver archiveRootObject:self.levelsStars toFile:pathToArchive];
}

这将对数组中的每个对象调用 encodeWithCoder: 并将它们写入文件。

于 2013-08-22T13:49:03.340 回答