CoreData与UserDefaults用于保存用户删除

时间:2017-01-06 18:54:18

标签: ios swift3

我刚刚开始使用UserDefaults一次或两次,从未使用过CoreData,所以我不确定在这种情况下使用哪个。我有一个表视图,其中有一个从空数组填充的单元格,由一个字符串数组填充,具体取决于页面标题。

换句话说,我在viewDidLoad中有一个函数,它检查navigationItem.title,并根据它是什么,用正确的字符串填充空数组。一切都很好,但我需要删除项目保持删除。这是我的代码:

初​​始化:

    static var places = [String]()
    var nycPlaces = ["Central Park", "Rockefeller Center", "Empire State Building"]
    var londonPlaces = ["London Eye", "Windsor Castle", "Tower of London"]
    var parisPlaces = ["Champs Elysee", "Eiffel Tower", "Catacombs"]

这是使用正确的数组填充表视图的函数 - 这在viewDidLoad中调用:

func populateCells() {

    switch navigationItem.title {
    case "New York":
        ListController.places = nycPlaces
    case "London":
        ListController.places = londonPlaces
    default:
        ListController.places = parisPlaces
    }

    tableView.reloadData()
}

要删除,我有:

override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath)
{
    if editingStyle == .delete
    {
        tableView.beginUpdates()
        ListController.places.remove(at: indexPath.row)
        tableView.deleteRows(at: [indexPath], with: .fade)
        tableView.endUpdates()
    }
}

问题在于,当我离开页面然后重新加载它时,无论之前删除了哪些字符串,都会使用3个字符串重新填充空数组。如何确保删除的单元格不会返回?

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

如果您的应用程序与您发布的代码一样简单,那么您应该使用UserDefaults(即,您不是从某个远程服务器获取数据,而且它实际上只是一些硬编码值)。

CoreData具有陡峭的学习曲线,难以使用且难以正确使用。对于你提出的情景来说,这是过度的。

另请注意:如果您不需要在进程退出并重新启动过程中持续存在,则可以创建可变数组,这些数组位于所有类可访问的位置(例如,您的AppDelegate,全局单例类,等等)并且只需修改它们到位了。

答案 1 :(得分:0)

由于这主要是静态数据,我建议不要使用CoreData的开销。相反,我会使用这种方法:

var nycPlaces: [String] {
    get {
        guard let retval = UserDefaults.standard.object(forKey: "nyc") as? [String] else {
            return ["Central Park", "Rockefeller Center", "Empire State Building"]
        }

        return retval
    } set {
        UserDefaults.standard.set(newValue, forKey: "nyc")
        UserDefaults.standard.synchronize()
    }
}

var londonPlaces: [String] {
    get {
        guard let retval = UserDefaults.standard.object(forKey: "london") as? [String] else {
            return ["London Eye", "Windsor Castle", "Tower of London"]
        }

        return retval
    } set {
        UserDefaults.standard.set(newValue, forKey: "london")
        UserDefaults.standard.synchronize()
    }
}

var parisPlaces: [String] {
    get {
        guard let retval = UserDefaults.standard.object(forKey: "paris") as? [String] else {
            return ["Champs Elysee", "Eiffel Tower", "Catacombs"]
        }

        return retval
    } set {
        UserDefaults.standard.set(newValue, forKey: "paris")
        UserDefaults.standard.synchronize()
    }
}

override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath)
{
    if editingStyle == .delete
    {
        tableView.beginUpdates()
        ListController.places.remove(at: indexPath.row)

        switch navigationItem.title {
        case "New York":
            nycPlaces = ListController.places
        case "London":
            londonPlaces = ListController.places
        default:
            parisPlaces = ListController.places
        }            

        tableView.deleteRows(at: [indexPath], with: .fade)
        tableView.endUpdates()
    }
}

P.S。 - 我还建议将这些数据放在更全局的范围内并使用枚举而不是对导航项目的标题进行字符串比较:)