簡體   English   中英

Swift:沒有實例變量的對象的NSCoding實現

[英]Swift: NSCoding Implementation For An Object Without Instance Variables

舉例:這里的初學者請多多包涵。 我剛剛學習了如何通過編碼/解碼和存檔/取消存檔來持久化對象。 現在的問題是我想保留一個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()
    }
}


有更好的方法嗎? 非常感謝。

希望這可以幫助

請添加正確的文件網址代替“文件名”

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)!


}

謝謝。

我完全誤解了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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM