Как сохранить массив объектов (с переменными изображения) в Swift и Xcode? - PullRequest
0 голосов
/ 02 февраля 2019

Мне интересно, как сохранить массив объектов из следующего класса:

class CustomDocument: NSObject, NSCoding {
    let name : String
    let image : UIImage

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

    //other code excluded
}

Первоначально я сохранил этот массив в пользовательских настройках по умолчанию.Поскольку объекты занимали много места, это вызывало большие задержки в приложении.

Каков наилучший способ сохранить массив данных, который занимает много места?

Большое спасибо за помощь, и все отзывы приветствуются.

1 Ответ

0 голосов
/ 02 февраля 2019

Попробуйте этот код, надеюсь, он поможет:

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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...