我应该使用NSUserDefault,字典,核心数据-还是其他?

时间:2018-10-18 07:53:53

标签: ios swift uitableview dictionary nsuserdefaults

我正在制作的应用程序存在一些问题,我认为用一些照片来解释会容易得多,所以...:

当然,nr中的“创建新人”按钮。 1会将您带到第二位。

现在,我在解决如何在“人物日记”中保存有关此人的数据时遇到了问题。目的是,当您输入一个人的名字时,添加一张照片(启用摄像​​头功能,以后会遇到麻烦...)并添加问题的答案-然后,您只需按“保存此人”,然后您将被重定向到AllPersonsInYourDiaryViewController,在该处现在有一个带有此新人名字的新tableViewCell(也许在字幕中也包含答案和在单元格中以微型显示的照片)。

(自然,您也可以在该单元格中输入有关此人的数据,但接下来是。)

到目前为止,在该应用程序中,当允许用户通过名称“ Antons Diary”创建带有特定问题的特定日记时,我使用了NSUserDefault。但是现在引起了我的注意,也许使用其他方法会更聪明?我尝试使用字典,但无法正常使用。

所以...:在我花大量时间尝试其中一种方法之前,有谁会比我聪明,告诉我最好的方法是什么?

2 个答案:

答案 0 :(得分:0)

我可以为您提供coreData和NSUserDefaults背后的逻辑,但是您将决定使用哪一个。

CoreData通常用作数据库。您可以为每个实体创建实体和属性。此外,您可以在这些实体之间创建关系。 从coreData提取数据时,可以使用NSSortDescriptor排列此数据,也可以使用NSPredicate选择特定记录。 因此,您可以看到CoreData是一个数据库。

NSUserDefaults通常用于保存密码,用户名,用户ID ...以及您将在应用程序中定期使用的此类问题。 NSUserDefaults使您可以随时直接访问保存的变量。但是,CoreData将花费更多时间和代码行来访问实体并进行查询。

现在,检查哪种方法更适合您的情况。

答案 1 :(得分:0)

如果我能给我两美分,那么您要做的第一件事就是“设计”如何以编程方式代表一个人。您可以创建一个结构或类来这样做,即使一个结构更合适:

struct Person {
    var name: String?
    var answer: String?
    var photo: String?
}

然后,您可以决定如何持久保存此类对象的数据。如果要使用数据库,则建议将SQLite与FMDB library一起使用。学习如何使用它非常容易,快捷,也非常方便。我已经使用了大型项目,并且运行顺利。我发现CoreData太复杂了,并且根据您的需要而矫kill过正。

如果您不想使用数据库,唯一的另一种方法是保存到文件,但是,这里仍然有一些选项。如果进行编码(请参阅Swift中的Codable协议),则可以使用NSKeyedArchiver转换为Data对象,然后再写入磁盘。如果您喜欢使用字典,并且由于一个人要拥有的属性不会太多,则可以通过分配属性及其值来创建字典,然后将其转换并另存为JSON数据,或者甚至Plist文件。如果您想要我写的take a look to a library,并不想提供任何帮助,只是想提供一些其他帮助,并且可以自动为您完成所有这些工作。这是您必须采用的协议,然后您可以立即将结构转换为字典,JSON或plist并保存到文件。

无论您要选择哪种方式,都将图像作为单个文件保存到文档目录,并仅将其文件名存储到数据库/文件中。基于它们,您可以在需要时轻松构建每个图像(或URL)的路径。 警告:请勿保存文档目录的完整路径,尤其是在Simulator上进行测试时;路径在每个版本上都在变化。仅保存文件名。

此外,如果您要使用上面显示的结构,则可以实现小型但非常方便的功能,这些功能将负责将数据保存,加载或更新到解决方案(数据库/文件)中最终会选择。这样一来,您就可以将相关的内容集中在一个地方,并且易于访问(例如person.save())。

struct Person {
    var name: String?
    var answer: String?
    var photo: String?

    func save() {
        …
    }

    func load() {
        …
    }

    // More functions…
}

最后,避免使用UserDefaults,或者至少在其中保留一些非关键数据。 UserDefaults并不意味着保留您的应用程序生成的所有数据。最重要的是,请勿将其用于保存敏感数据,尤其是密码或类似的东西。

希望以上内容对您有所帮助。