NSUserDefault vs Global Variable vs CD vs Singleton - 一个具体的例子

时间:2015-04-02 18:01:45

标签: ios

在我的健身应用程序中,我存储了需要在不同程度上访问整个应用程序的各种值。目标,最大,最小,类名,fontColors,笔画,gradientColors等。由于我正在学习编码时创建应用程序,我使用了所有上述存储方法的混合 - 一个正确的混乱。 要点目标变量(如10,000步或目标权重)会在整个应用中显示并经常在代码中使用,但用户不会更改它们经常。最重要的是,在整个版本更新期间,目标仍然存在,因为如果用户将不得不再次添加它们,则会感到恼火。存储目标变量的最佳实践是什么,可能有20个左右?

2 个答案:

答案 0 :(得分:2)

常见规则如下:可以轻松重新创建的信息应该存储在内存中,而用户输入的信息/进度应该保留在某个地方。

核心数据 vs NSUserDefaults 。在NSUserDefaults中存储基本信息(如IntString等)(这是最简单的方法)和核心数据中的复杂信息(数组,复杂对象,对象关系)(请查看{{ 3}} - 它是核心数据的更好替代品。)

全局变量 vs Singleton 。在大多数情况下,全局变量是一种非常差的做法。它们应属于特定类,如果需要,您可以在其中创建单例(例如 - class AppSettings,其中包含单例并管理应用程序的基本设置)。

考虑到你有20个可由用户更改的目标(因此无法重新创建),我建议您使用CoreData或Realm。

另请查看Realm - 在那里存储用户的进度(例如燃烧的卡路里)可能是个好主意。

答案 1 :(得分:1)

首先要问自己的是:我的申请是做什么的?它听起来像一个健身应用程序,因此健身数据应存储在您的数据模型中,这是满足您的应用程序的业务逻辑要求的任何数据的存储库(即跟踪我的用户和健身数据)。 p>

人们使用几种持久性机制来处理数据模型,其中最简单的方法是将数据存储在字典中,然后将其读/写到文件系统中 - 这对于原型来说是可以接受的,但就像你一样添加功能和数据模型变得更加复杂,您需要考虑NSCoding或CoreData。

但是如果您存储健身数据,您可能需要考虑Healthkit,它允许您直接存储健身和健康数据,允许您与其他应用程序共享不同类型的健康数据。

NSUserDefaults通常是存储用户首选项或业务逻辑之外的任何数据的地方。除非您的应用程序非常简单,否则您需要将数据模型保留在NSUserDefaults之外,原因有多种。

以下是您使用字典的方式:

class MyDataModel {

    var goalSteps : Int {
        get { return dict["goal1"] as? Int ?? 0 }
        set { dict["goal1"] = newValue }
    }

    var goal2 : String {
        get { return dict["goal2"] as? String ?? "" }
        set { dict["goal2"] = newValue }
    }
    // ... Etc etc ...

    // Load the data model from a path
    init(path: String)
    {
        dict = NSMutableDictionary(contentsOfFile: path)!
    }

    func Save(toPath : String) {
        dict.writeToFile(toPath, atomically: true)
    }

    private var dict = NSMutableDictionary()
}