我通常在一个编码我的数据 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 回来(它不是零),但 [unarchiver decodeObjectForKey:@"data"] 将返回零。看起来好像键@"data"没有对象,即使应该有。我想编码时肯定出了什么问题,但我不确定如何解决这个问题。我能拿走里面的东西吗? data 并对其进行编码,而不是担心它是否得到了正确的密钥?我的意思是应该只有一个关键的"数据"。

有帮助吗?

解决方案

为什么你的代码如此复杂:) 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