如何在 Swift 和 Xcode 中保存对象数组(带有图像变量)?

How to save array of objects (with image variables) in Swift and Xcode?

我想知道如何从以下 class:

中保存对象数组
class CustomDocument: NSObject, NSCoding {
    let name : String
    let image : UIImage

    init(n: String, i: UIImage){
        name = n
        image = i
    }

    //other code excluded
}

最初,我将此数组保存到用户默认值。因为对象占用了很多space,所以造成了app的很多卡顿。

保存占用大量 space 的数据数组的最佳方法是什么?

非常感谢您的帮助,感谢所有回复。

试试这个代码,希望对你有帮助:

class CustomDocument: NSObject, NSCoding  {

    var name : String?
    var image : UIImage?

    func encode(with aCoder: NSCoder) {
        aCoder.encode(name, forKey: "namekey")
        if let imageData = image!.jpegData(compressionQuality: 1.0){
            aCoder.encode(imageData, forKey: "imagekey")
        }
        UserDefaults.standard.synchronize()
    }

    required convenience init?(coder aDecoder: NSCoder) {
        self.init()
        if let name =  (aDecoder.decodeObject(forKey: "namekey") as? String){
            self.name = name
        }
        if let imageData = (aDecoder.decodeObject(forKey: "imagekey")  as? Data){
            if let image = UIImage(data: imageData){
                self.image = image
            }
        }
    }
}


func archiveDocument(document:CustomDocument) -> Data? {
    do {
        let archivedObject = try NSKeyedArchiver.archivedData(withRootObject: document, requiringSecureCoding: false)
        return archivedObject

    } catch {
        // do something with the error
    }
    return nil
}


func unarchiveDocument(unarchivedObject:Data) -> CustomDocument? {
    do {
        if let document = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(unarchivedObject) as? CustomDocument {
            return document
        }
    } catch {
        // do something with the error
    }
    return nil
}

示例:

//Set the object, also you can use an array instead of an object
let obj = CustomDocument()
obj.name = "doc1"
obj.image = UIImage(named: "my_image")
if let archivedObject = archiveDocument(document: obj){
    UserDefaults.standard.set(archivedObject, forKey: "obj")
}

//Get the object
if let  archivedObject = UserDefaults.standard.data(forKey: "obj"){           
    obj = unarchiveDocument(unarchivedObject: archivedObject)
    let myImage = obj?.image
}