用户默认值还是核心数据?

Bar*_*iak 0 xcode caching core-data nsuserdefaults swift

我需要在我的应用程序(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()
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

首先,我正在从JSON下载项目。下载后,我将其保存,如下所示:

myItemManager.manager.items = downloadedItems
Run Code Online (Sandbox Code Playgroud)

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

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

Dha*_*esh 9

NSUserDefaults顾名思义(模糊地)应仅用于存储首选项和应用程序设置。您不应该在其中存储关键数据和/或用户数据。

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

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

例:

应用程序首选项(例如显示通知,切换开关设置,UISegmentedControl设置)都进入NSUserDefaults。尽管您可能会使用网络服务获取任何数据(例如,一个国家/地区的所有城市的列表),但用户的待办事项列表将进入CoreData。

PS:我不建议您使用Wiki撰写技术文章,但要快速了解CoreData,请参阅此处

NSUserDefaults的优点:

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

NSUserDefaults的缺点:

  • 不适合大数据集

  • 当您尝试存储和加载大量数据时,性能会受到影响。

CoreData的优点:

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

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

  • 强大的功能

CoreData的缺点

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

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

  • 您无法使用CoreData进行日常学习和实施

  • 在改善应用程序的同时,还需要改善数据架构

  • 如果不小心,迁移到新版本可能会很痛苦。

参考从这里