【问题标题】:Swift: NSCoding Implementation For An Object Without Instance VariablesSwift:没有实例变量的对象的 NSCoding 实现
【发布时间】:2017-12-06 15:47:41
【问题描述】:

例子:这里的初学者请多多包涵。我刚刚学会了如何通过编码/解码和归档/取消归档来持久化对象。问题是现在我想保留一个 UIImage。推荐的方法是什么?

我当前的实现可行但看起来很奇怪:

class Photo: NSObject, NSCoding {

    static let documentsDirectory = FileManager.default.urls(for: .documentDirectory,in: .userDomainMask).first!
    static let archiveURL = documentsDirectory.appendingPathComponent("photo")

    static func saveToDisk(selectedPhoto: UIImage) {
        NSKeyedArchiver.archiveRootObject(selectedPhoto, toFile: archiveURL.path)
    }

    static func loadFromDisk() -> UIImage? {
        guard let unarchivedPhoto = NSKeyedUnarchiver.unarchiveObject(withFile: archiveURL.path) as? UIImage
            else {return nil}
        return unarchivedPhoto
    }

    func encode(with aCoder: NSCoder) {
    }

    convenience required init?(coder aDecoder: NSCoder) {
        self.init()
    }
}


有更好的方法吗?非常感谢。

【问题讨论】:

  • 您希望如何将 plist 文件转换为 UIImage?如果您真的想将 UIImage 保存到 plist 文件中(您不应该),您首先需要将 UIImage 转换为 JPEG 或 PNG 数据表示。
  • ARRH 我现在看到了。所以我应该使用 UIImageJPEGRepresentation() 将其转换然后写入路径,对吗?抱歉,我知道这是一个菜鸟问题。
  • 是的,您需要将其保存为 JPEG 或 PNG。我建议使用 JPEG,因为 PNG 会丢弃图像方向
  • 非常感谢 Leo,现在我明白了!干杯!天哪,我太笨了。
  • 我回滚了你上次的编辑。不要使用解决方案编辑您的问题,而是在下面发布您的解决方案作为实际答案。

标签: ios swift nscoding


【解决方案1】:

希望对你有帮助

请添加正确的文件 url 代替“文件名”

func convertImageToDataAndWrite()
{
    let img:UIImage = UIImage(named: "img1.png")!
    let data:NSData? = UIImageJPEGRepresentation(img, 0.7)
    if data != nil
    {
        var check:Bool =  NSKeyedArchiver.archiveRootObject(data!, toFile: "filename")

    }

}

func readImagefromFile()
{
    let data:NSData = NSKeyedUnarchiver.unarchiveObjectWithFile("filename") as! NSData!
    var img:UIImage = UIImage(data: data)!


}

谢谢。

【讨论】:

  • 感谢您的帮助!我阅读了更多关于存档和序列化的 Apple 文档,这是我的书未涵盖的缺失部分:存档提供了一种将对象和值转换为与体系结构无关的字节流的方法,该字节流保留了身份和之间的关系对象和价值观。所以我相信在这种情况下, UIImage 不应该被存档,因为没有要保留的关系?
  • uiimage 是一个不能像在 plist 等中那样保存在外部的对象,要在 plist 中保存图像,您需要将其转换为字节形式。
  • 谢谢 Gypsa 我现在得到了数据部分。除此之外,存档数据与不存档仅写入数据相比有什么特别的优势吗?
【解决方案2】:

我完全误解了 NSCoding 和 Archive 的使用。 “档案提供了一种将对象和值转换为独立于体系结构的字节流的方法,它保留了对象和值的身份以及它们之间的关系。”

所以要简单地保存/加载 UIImage:

// Define path
let documentsDirectory = FileManager.default.urls(for: .documentDirectory,in: .userDomainMask).first!
let photoURL = documentsDirectory.appendingPathComponent("photo.jpg")

// Convert selectedPhoto to Data and write to path
if let data = UIImageJPEGRepresentation(selectedPhoto, 1) {
    try? data.write(to: photoURL)
}

// Load Data and init UIImage
UIImage(contentsOfFile: photoURL.path)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-07
    • 1970-01-01
    • 1970-01-01
    • 2011-03-11
    • 2014-04-20
    相关资源
    最近更新 更多