首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Swift:不带实例变量的对象的NSCoding实现

Swift:不带实例变量的对象的NSCoding实现
EN

Stack Overflow用户
提问于 2017-12-06 23:47:41
回答 2查看 222关注 0票数 0

一个恰当的例子:这里的初学者请耐心等待。我刚刚学会了如何通过编码/解码&存档/解压来持久化对象。问题是我现在想要持久化一个UIImage。推荐的方法是什么?

我目前的实现可以工作,但看起来非常奇怪:

代码语言:javascript
复制
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()
    }
}

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

EN

回答 2

Stack Overflow用户

发布于 2017-12-07 02:56:38

希望这能有所帮助

请添加正确的文件url来代替"filename“

代码语言:javascript
复制
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)!


}

谢谢。

票数 0
EN

Stack Overflow用户

发布于 2017-12-07 03:17:07

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

因此,要保存/加载UIImage:

代码语言:javascript
复制
// 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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47678272

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档