Вопрос

Обычно я кодирую свои данные в 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