是否可以将NSData(从NSKeyedArchiver获取)保存为NSString,然后作为NSData读回?

时间:2017-07-28 18:02:54

标签: swift nsstring nsdata nskeyedarchiver

我想将一些信息保存到视频元数据中。现在我可以保存文本,即String对象。

// 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,它崩溃了,现在我坚持写{读到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”,因为无法确定其内容的文本编码。"

我认为问题是从NSData获得的NSKeyedArchiver无效NSString。如果我是正确的,如何将数据转储为文本?然后用相同的字节(NSKeyedUnarchiver)恢复它?

提前致谢!

1 个答案:

答案 0 :(得分:1)

为什么要将数据保存为文本文件?即使你可以将Data保存为字符串(事实上你可以用base64对其进行编码),但无论如何它都不是人类可读的 - 很可能很少有人能够流畅地阅读base64。

长话短说,将Data直接保存到磁盘并将其读回。 Data提供了适当的API。

顺便说一下:archiveRootObject(toFile无论如何写Data,所以请阅读try Data(contentsOfFile: tempFilepath)并返回。