2012-10-01 62 views
0

我通常編碼在NSFileWrapper這樣我的數據未找到(我離開了NSFileWrapper位):重點在NSKeyedUnarchiver對象

-(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中的任何內容並對其進行編碼,而不必擔心它是否具有正確的密鑰?我的意思是應該只有一個關鍵的「數據」。

+1

爲什麼你的代碼這麼複雜?爲什麼不只是'返回[NSKeyedArchiver archivedDataWithRootObject:o];'和'返回[NSKeyedUnarchiver unarchiveObjectWithData:data];'? – deanWombourne

+0

@deanWombourne好問題。我對NSFileWrapper感到非常困惑,我遵循Apple的Examples和Wenderlich的教程......所以我猜我犯了一個盲目的錯誤,那就是我無法理解100%的錯誤代碼。我現在就試試這個,並且會讓你知道。也許把你的評論放在下面的答案中?謝謝! –

+1

因爲我的評論並沒有真正回答你的問題 - 可能有你需要這種複雜性的原因。但是,因爲沒有,請參閱下面的答案:) – deanWombourne

回答

1

爲什麼你的代碼這麼複雜了:) NSKeyedArchiver類有輔助方法,將你想要更簡單的東西:

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

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

嗯......我唯一的問題是,返回[NSKeyedUnarchiver unarchiveObjectWithData:data];不會使用某個鍵來解密數據(現在它總是返回零,因爲我的數據之前用我的卷積代碼「鍵入」)。無論如何要在不知道密鑰的情況下提取對象? –