swift - 将 Firebase 快照数组保存到 NSUserDefaults
问题描述
我正在使用 Swift 从我的 Firebase 数据库中检索数据。当用户首次登录时,我想将 Firebase 快照中的“地点”保存为 UserDefault。
static func getAllPlaces(){
databaseRef = Database.database().reference()
databaseRef.database.reference().child("places").observe(.childAdded) { (snapshot: DataSnapshot) in
if let value = snapshot.value as? NSDictionary {
let place = Place()
let id = value["id"] as? String ?? "ID not found"
let title = value["title"] as? String ?? "Title not found"
let type = value["type"] as? String ?? ""
place.id = id
place.title = title
place.type = type
DispatchQueue.global().async {
// Something here to append place data to UserDefaults?
places.append(place) // appends to NSObject for later use
}
}
}
}
当前的代码运行良好——我只需要添加一些东西来存储它,这样我以后就可以获取它了。
额外的问题:我在 Firebase 数据库中存储了好几百个快照。我想将它们存储在设备上的原因是用户不必继续下载数据。这是一个好主意吗?会不会占用很多内存?
任何帮助,将不胜感激。
解决方案
将自定义类/数据保存到 UserDefaults 的一种方法是像这样对它们进行编码:
let encodedData: Data = NSKeyedArchiver.archivedData(withRootObject: place)
UserDefaults.standard.set(encodedData, forKey: "place")
UserDefaults.standard.synchronize()
然后你可以像这样解码它:
if UserDefaults.standard.object(forKey: "place") != nil{
let decodedData = UserDefaults.standard.object(forKey: "place") as! Data
let decodedPlace = NSKeyedUnarchiver.unarchiveObject(with: decodedData) as! Place
}
为 swift 4 和 iOS 12 更新:
do {
let encodedData: Data = try NSKeyedArchiver.archivedData(withRootObject: place, requiringSecureCoding: false)
UserDefaults.standard.set(encodedData, forKey: "place")
UserDefaults.standard.synchronize()
} catch {
//Handle Error
}
do {
if UserDefaults.standard.object(forKey: "place") != nil{
let decodedData = UserDefaults.standard.object(forKey: "place") as! Data
if let decodedPlace = try NSKeyedUnarchiver.unarchiveTopLevelObjectWithData(decodedData) as? Place {
//Do Something with decodedPlace
}
}
}
catch {
//Handle Error
}
推荐阅读
- python - 类 SystemDialog:无法识别我的系统对话框窗口
- react-native - React-Native 自动完成输入中的 textInput 中的边框
- reactjs - 用玩笑测试 Material-UI Textfield 选择组件
- python - 从键中提取 JSON 值
- python - Keras 自定义 Lambda 层来包装预处理函数 tf.placeholder() 运行时错误
- python - 请解释为什么我没有 100% 的时间得到值错误?
- google-cloud-platform - 未找到大查询数据集,但显示在列表中
- r - 如何仅获取以特定字符开头的数据框的列名?
- swift - 测试依赖于异步数据源的视图模型
- javascript - 单击黑暗区域时如何关闭侧边菜单?