Swift:使用NSCoding保存数据非常慢 - 如何加快速度?

时间:2018-03-11 20:23:37

标签: ios swift data-structures save nscoding

我正在密切关注开发人员教程:

Start Developing iOS Apps

这很容易理解,但使用NSCoding保存数据非常慢(按下保存按钮后,即使在最新的手机上也需要几秒钟!)。有没有办法加快速度呢?

MealViewController.swift unwindSegue发送已创建的数据到保存它的MealTableViewContorller.swift。在Meals.swift文件中,创建了包含NSCoding的数据结构:

我刚刚在这里添加了NSCoding代码,以便您可以看到如何保存数据,并且可以找到解决方法来解决这个问题。

Meal.swift:

class Meal: NSObject, NSCoding {


    //MARK: Archiving Paths
    static let DocumentsDirectory = FileManager().urls(for: .documentDirectory, in: .userDomainMask).first!
    static let ArchiveURL = DocumentsDirectory.appendingPathComponent("meals")

    //MARK: Types

    struct PropertyKey {
        static let name = "name"
        static let photo = "photo"
        static let rating = "rating"
    }

    //MARK: NSCoding

    func encode(with aCoder: NSCoder) {
        aCoder.encode(name, forKey: PropertyKey.name)
        aCoder.encode(photo, forKey: PropertyKey.photo)
        aCoder.encode(rating, forKey: PropertyKey.rating)
    }

    required convenience init?(coder aDecoder: NSCoder) {

        // The name is required. If we cannot decode a name string, the initializer should fail.
        guard let name = aDecoder.decodeObject(forKey: PropertyKey.name) as? String else {
            os_log("Unable to decode the name for a Meal object.", log: OSLog.default, type: .debug)
            return nil
        }

        // Because photo is an optional property of Meal, just use conditional cast.
        let photo = aDecoder.decodeObject(forKey: PropertyKey.photo) as? UIImage

        let rating = aDecoder.decodeInteger(forKey: PropertyKey.rating)

        // Must call designated initializer.
        self.init(name: name, photo: photo, rating: rating)

    }
}

MealTableViewController.swift:

private func saveMeals() {
        let isSuccessfulSave = NSKeyedArchiver.archiveRootObject(meals, toFile: Meal.ArchiveURL.path)
        if isSuccessfulSave {
            os_log("Meals successfully saved.", log: OSLog.default, type: .debug)
        } else {
            os_log("Failed to save meals...", log: OSLog.default, type: .error)
        }
    }

另一方面,加载数据的速度非常快。

0 个答案:

没有答案