Ключ не найден в объекте NSKeyedUnarchiver

Обычно я кодирую свои данные в 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"] возвращает NIL. Похоже, что для ключа @"data" объекта нет, хотя он должен быть. Я предполагаю, что что-то пошло не так при кодировании, но я не уверен, как это исправить. Могу ли я просто взять все, что находится в data, и закодировать его, не беспокоясь о том, есть ли у него правильный ключ? Я имею в виду, что должен быть только один ключ «данные».


person n.evermind    schedule 01.10.2012    source источник
comment
Почему ваш код такой сложный? Почему не просто return [NSKeyedArchiver archivedDataWithRootObject:o]; и return [NSKeyedUnarchiver unarchiveObjectWithData:data]; ?   -  person deanWombourne    schedule 01.10.2012
comment
@deanWombourne Хороший вопрос. Я был так сбит с толку NSFileWrapper, что следовал примерам Apple и учебнику Вендерлиха.... поэтому я думаю, что совершил ошибку, слепо следуя запутанному коду, который я не понимал на 100%. Я попробую это прямо сейчас и дам вам знать. Возможно, поместите свой комментарий в ответ ниже? Спасибо!   -  person n.evermind    schedule 01.10.2012
comment
Поскольку мой комментарий на самом деле не ответит на ваш вопрос, возможно, была причина, по которой вам понадобилась эта сложность. Однако, поскольку его нет, см. Мой ответ ниже :)   -  person deanWombourne    schedule 01.10.2012


Ответы (1)


Почему ваш код такой сложный :) В классе NSKeyedArchiver есть вспомогательные методы, которые сделают то, что вы хотите, проще:

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

// To turn NSData into your object again
return [NSKeyedUnarchiver unarchiveObjectWithData:data];
person deanWombourne    schedule 01.10.2012
comment
Хм... моя единственная проблема в том, что return [NSKeyedUnarchiver unarchiveObjectWithData:data]; не будет разархивировать данные с определенным ключом (теперь он всегда будет возвращать nil, поскольку мои данные ранее были «введены» с помощью моего запутанного кода). Можно ли как-то извлечь объект, не зная его ключа? - person n.evermind; 01.10.2012