2017-07-28 25 views
0

我想將一些信息保存到視頻元數據中。現在我可以保存文本,即String對象。是否可以將NSData(從NSKeyedArchiver獲得)作爲NSString保存,然後作爲NSData讀回?

// this works well 
let metaItem = AVMutableMetadataItem() 
metaItem.key = AVMetadataCommonKeySource as NSCopying & NSObjectProtocol 
metaItem.keySpace = AVMetadataKeySpaceCommon 
metaItem.value = String("some text") as! NSCopying & NSObjectProtocol 

因此,而不是隻是String我想序列化的自定義對象:

class ARTRMetadata: NSObject, NSCoding { 
    // ... 
    required init(coder aDecoder: NSCoder) { 
     //... 
    } 
    func encode(with aCoder: NSCoder) { 
     //... 
    } 
} 

我試圖Data轉換爲String,它墜毀,現在我stucked在寫入/讀取Data.txt文件:

static func saveMetadataObjectAsText(memento: ARTRMetadata)->String { 
     let tempFilepath = NSTemporaryDirectory().appending("someFile2.txt") 
     FileManager.default.createFile(atPath: tempFilepath, contents: nil, attributes: nil) 

     if NSKeyedArchiver.archiveRootObject(memento, toFile: tempFilepath) {} 
     else { print("archiveRootObject toFile: FAILURE") } 

     do { 
      let contentsFeedToMetadataItem = try String(contentsOfFile: tempFilepath) 
      //let contentsFeedToMetadataItem = try String(contentsOfFile: tempFilepath, encoding: String.Encoding.utf8) // The file 「someFile2.txt」 couldn’t be opened using text encoding Unicode (UTF-8). 
      return contentsFeedToMetadataItem 
     } 
     catch { print(error) } 
     return "ERROR in contentsFeedToMetadataItem" 
    } 

現在它崩潰,因爲「文件」someFile2.txt「無法打開因爲其內容的文本編碼無法確定。「

我想問題是從NSKeyedArchiver獲得的NSData無效NSString。如果我是正確的,如何將數據轉儲爲文本?然後用相同的字節恢復它(對於NSKeyedUnarchiver)?

提前致謝!

回答

1

爲什麼要將數據保存爲文本文件?即使你可以將Data保存爲字符串(事實上,如果你使用base64對其進行編碼,也可以),但它不是人類可讀的 - 也許有很少人能夠流利地閱讀base64。

長話短說,將Data直接保存到磁盤並讀回。 Data提供了適當的API。

順便說一句:archiveRootObject(toFileData反正,所以讀try Data(contentsOfFile: tempFilepath)並返回。

+0

非常感謝!我會在星期一檢查它,然後會接受。 :) –