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

标签 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”,因为无法确定其内容的文本编码。”

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

提前致谢!

最佳答案

为什么要将数据保存为文本文件?即使你可以节省 Data作为字符串(如果你用 base64 编码它确实可以)它无论如何都不是人类可读的 - 可能很少有人能流利地阅读 base64。

长话短说,保存Data直接写入磁盘并读回。 Data提供适当的 API。

顺便说一句:archiveRootObject(toFileData无论如何,请阅读try Data(contentsOfFile: tempFilepath)并返回。

关于swift - 是否可以将 NSData(从 NSKeyedArchiver 获得)保存为 NSString,然后作为 NSData 读回?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45379745/

相关文章:

ios - 为什么 CollectionView 中的自定义按钮只加载到最后一个单元格中? ( swift )

objective-c - 在 Objective-C 中计算两个日期之间的天数

iphone - 上传或导出大视频会占用内存并导致崩溃...我该如何分解它?

cocoa - NSData 和嵌入式指针澄清

objective-c - NSData 指针与引用

ios - 如何添加到 UINavigationController 推送动画,而不是替换它?

iOS Swift SpriteKit : How to make a child spritenode's position and movements to be the same as its parent spritenode?

swift - 背景图像节点干扰触摸命令

objective-c - Emojis 搞乱了 obj-c 的 sizeWithFont 数学

objective-c - 如何编写 IF ELSE 来检查数组的字符串内容?