質問

通常、このように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にあるものは何でも取ることができますか、それを符号化し、それが正しいキーを持っているのであれば心配しませんか?私は1つのキー「データ」だけであるべきであることを意味します。

役に立ちましたか?

解決

なぜあなたのコードが複雑なのですか:) NSKeyedArchiverクラスには、あなたがより簡単にあなたが望むものをするヘルパーメソッドがあります:

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

// To turn NSData into your object again
return [NSKeyedUnarchiver unarchiveObjectWithData:data];
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top