【问题标题】:Should I use NSUserDefault, dictionaries, core data - or something else?我应该使用 NSUserDefault、字典、核心数据 - 还是其他东西?
【发布时间】:2018-10-18 07:53:52
【问题描述】:

我正在制作的应用程序有一些问题,我认为用一些照片更容易解释,所以...:

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

现在,我在弄清楚如何将有关此人的这些数据保存在“人物日记”中时遇到了问题。目标是,当您输入一个人的姓名时,添加一张照片(启用相机功能,我稍后会努力解决......)并添加问题的答案 - 然后您只需要按“保存这个人”,然后你将被重定向到 AllPersonsInYourDiaryViewController,现在有一个新的 tableViewCell 带有这个新人的名字(可能带有包含答案的副标题和单元格中的缩影照片)。

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

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

所以...:在我花几个小时玩这些方法之一之前,有没有比我聪明的人告诉我最好的方法是什么?

【问题讨论】:

    标签: ios swift uitableview dictionary nsuserdefaults


    【解决方案1】:

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

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

    然后您可以决定如何持久保存此类对象的数据。如果你想使用数据库,那么我建议使用带有FMDB library 的 SQLite。学习如何使用它真的很容易和快速,而且它也很方便。我在大型项目中使用过它,并且运行顺利。根据您的需要,我发现 CoreData 太复杂而且过分了。

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

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

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

    struct Person {
        var name: String?
        var answer: String?
        var photo: String?
    
        func save() {
            …
        }
    
        func load() {
            …
        }
    
        // More functions…
    }
    

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

    我希望以上内容能帮助你做出决定。

    【讨论】:

      【解决方案2】:

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

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

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

      现在,看看哪种方法更适合你的情况。

      【讨论】:

      猜你喜欢
      • 2017-05-22
      • 1970-01-01
      • 1970-01-01
      • 2014-02-10
      • 2011-06-11
      • 1970-01-01
      • 1970-01-01
      • 2011-11-04
      • 2011-04-03
      相关资源
      最近更新 更多