0

私は通常、次のNSFileWrapperようにデータをエンコードします(NSFileWrapperビットは省略します)。

-(NSData*)encodeObject:(id<NSCoding>)o {
        @autoreleasepool {            
            NSMutableData *data = [NSMutableData data];
            NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
            [archiver encodeObject:o forKey:@"data"];
            [archiver finishEncoding];
            return data;
        }
    }

そして、私は通常、これを行うときにデータを取り戻します。

- (id)decodeObjectFromWrapperWithPreferredFilename:(NSString *)p {

    NSFileWrapper *wrapper = [self.fileWrapper.fileWrappers objectForKey:p];
    if (!wrapper) {
        NSLog(@"Unexpected error: Couldn't find %@ in file wrapper!", p);
        return nil;
    }

    NSData *data = [wrapper regularFileContents];
    NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:data];

    NSLog(@"%@", [unarchiver decodeObjectForKey:@"data"]);
    return [unarchiver decodeObjectForKey:@"data"];

}

時々、私はNSData戻ってきます(それはnilではありません)が、[unarchiver decodeObjectForKey:@"data"]NILを返します。キー@"data"のオブジェクトはあるはずなのに、ないように見えます。エンコード時に問題が発生したに違いないと思いますが、これをトラブルシューティングする方法がわかりません。data正しいキーを持っているかどうかを心配することなく、入っているものをすべて取り出してエンコードできますか?つまり、重要な「データ」は1つだけである必要があります。

4

1 に答える 1

1

なぜあなたのコードはとても複雑なのですか:)NSKeyedArchiverクラスにはあなたがもっと簡単にやりたいことをするヘルパーメソッドがあります:

// to turn an object into NSData
return [NSKeyedArchiver archivedDataWithRootObject:o]; 

// To turn NSData into your object again
return [NSKeyedUnarchiver unarchiveObjectWithData:data];
于 2012-10-01T10:59:03.297 に答える