UserDefaults或核心数据?

时间:2017-11-21 11:42:18

标签: swift xcode caching core-data nsuserdefaults

我需要在我的应用程序中存储一些对象(Xcode 9.1,Swift 4)。目前,我正在存储它:

class myItemManager {

    var items: [myItem]? {
        didSet {
            Cache.c.items = items
        }
    }

    static var manager = myItemManager() {
        didSet {
            myItemManager.manager.items = Cache.c.items
        }
    }
}

class Cache {

    private let uds = UserDefaults.standard

    static let c = Cache()

    var items: [(myItem)]? {
        get {
            if let decoded = uds.object(forKey: Constants.Cache.myItem) as? Data {
                let decodedItems = NSKeyedUnarchiver.unarchiveObject(with: decoded) as? [myItem]
                return decodedItems
            } else {
               return nil
            }
        }
        set {
            let encodedData: Data = NSKeyedArchiver.archivedData(withRootObject: newValue as AnyObject)
            uds.set(encodedData, forKey: Constants.Cache.myItem)
            uds.synchronize()
        }
    }
}

首先,我正在下载项目(来自JSON)。下载之后,我就保存它,就像这样:

myItemManager.manager.items = downloadedItems

当然,“myItem”是NSObject和NSCoding的子类(允许保存在UserDefaults中)。

这是一个好方法吗?或者我应该使用核心数据?将来,我将不得不过滤这些数据并将其呈现在UICollectionView中。

2 个答案:

答案 0 :(得分:5)

NSUserDefaults顾名思义(含糊地)应仅用于存储偏好设置和应用设置。您不应将关键数据和/或用户数据存储在其中。

CoreData是一个完整的持久性框架,支持大型数据事务。 CoreData允许您构建用于存储用户数据的关系实体属性模型。

请注意 CoreData是一个框架,可以使用SQLite二进制格式来存储数据(默认模板始终使用SQLite)。

示例:

应用程序首选项,如显示通知,切换开关设置,UISegmentedControl设置都进入NSUserDefaults。您可以使用Web服务获取的任何数据,例如国家/地区中所有城市的列表,用户的待办事项列表会进入CoreData。

PS:我不推荐维基技术写作,但要快速了解CoreData,请参考here

NSUserDefaults的优点:

  • 易于存储和检索数据。
  • 用于存储具有最小模糊的默认值。

NSUserDefaults的缺点:

  • 不适合大型数据集

  • 尝试存储和加载大量数据时性能下降 全有或全无的方法

CoreData的优点:

  • 可靠的框架,可以与数据进行交互和查询

  • 正确设置(有关系)时可以非常快

  • 强大的功能

CoreData的缺点

  • 需要时间掌握并学习核心概念

  • 需要适当的应用程序架构设计才能高效

  • 您无法使用CoreData

  • 进行日常学习和实施
  • 在改进应用时,您需要改进数据架构

  • 如果不小心,迁移到新版本会很麻烦。

来自HERE的参考。

答案 1 :(得分:1)

如果数据与用户偏好无关,则不要将其存储在那里。在使用Core Data运行完整的monty之前,将数据序列化到容器中的外部文件怎么样?