UserDefaults 还是核心数据?
UserDefaults or Core Data?
我需要在我的应用程序中存储一些对象(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中呈现。
NSUserDefaults
顾名思义(含糊地)应该仅用于存储首选项和应用程序设置。您不应将关键数据和/或用户数据存储到其中。
CoreData 是一个成熟的持久性框架,支持大数据事务。 CoreData 允许您构建用于存储用户数据的关系实体-属性模型。
请注意 CoreData 是一个框架 并且可以使用 SQLite
二进制格式来存储数据(默认模板始终使用 SQLite
)。
示例:
显示通知、切换开关设置、UISegmentedControl 设置等应用首选项都进入 NSUserDefaults。而您可能使用 Web 服务获取的任何数据(例如一个国家/地区所有城市的列表)、用户的待办事项列表都会进入 CoreData。
PS: 我不推荐 wiki 来写技术文章,但要快速了解 CoreData,请参考 here!
NSUserDefaults 的优点:
- 易于存储和检索数据。
- 对于存储具有最小模糊度的默认值很有用。
NSUserDefaults 的缺点:
不适合大数据集
当您尝试存储和加载大量数据时性能下降
全有或全无方法
CoreData 的优点:
用于交互和查询数据的可靠框架
如果设置正确(有关系)可以非常快
强大的功能
CoreData 的缺点
需要时间来掌握和学习核心概念
需要适当的应用架构设计才能高效
您无法通过 CoreData
一天学会并实施
在改进应用程序的同时,您需要改进数据架构
还有
如果不小心,迁移到新版本可能会很痛苦。
参考来自 HERE.
如果数据与用户偏好无关,则不要将其存储在那里。在完全使用 Core Data 之前将数据序列化到容器中的外部文件怎么样?
我需要在我的应用程序中存储一些对象(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中呈现。
NSUserDefaults
顾名思义(含糊地)应该仅用于存储首选项和应用程序设置。您不应将关键数据和/或用户数据存储到其中。
CoreData 是一个成熟的持久性框架,支持大数据事务。 CoreData 允许您构建用于存储用户数据的关系实体-属性模型。
请注意 CoreData 是一个框架 并且可以使用 SQLite
二进制格式来存储数据(默认模板始终使用 SQLite
)。
示例:
显示通知、切换开关设置、UISegmentedControl 设置等应用首选项都进入 NSUserDefaults。而您可能使用 Web 服务获取的任何数据(例如一个国家/地区所有城市的列表)、用户的待办事项列表都会进入 CoreData。
PS: 我不推荐 wiki 来写技术文章,但要快速了解 CoreData,请参考 here!
NSUserDefaults 的优点:
- 易于存储和检索数据。
- 对于存储具有最小模糊度的默认值很有用。
NSUserDefaults 的缺点:
不适合大数据集
当您尝试存储和加载大量数据时性能下降 全有或全无方法
CoreData 的优点:
用于交互和查询数据的可靠框架
如果设置正确(有关系)可以非常快
强大的功能
CoreData 的缺点
需要时间来掌握和学习核心概念
需要适当的应用架构设计才能高效
您无法通过 CoreData
一天学会并实施
在改进应用程序的同时,您需要改进数据架构 还有
如果不小心,迁移到新版本可能会很痛苦。
参考来自 HERE.
如果数据与用户偏好无关,则不要将其存储在那里。在完全使用 Core Data 之前将数据序列化到容器中的外部文件怎么样?