swift - 将 Firebase 快照数组保存到 NSUserDefaults

标签 swift firebase firebase-realtime-database 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
}

关于swift - 将 Firebase 快照数组保存到 NSUserDefaults,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53436673/

相关文章:

xcode - Swift NSLocale 模拟器 iOS 8

javascript - try catch UID 并将其设为常量

java - Android - Firebase 通知在点击时打开一个 Activity

ios - [Firebase/Core][I-COR000022] Firebase Analytics 不可用

ios - Firebase iOS SDK - 如何计算表现良好的 child 数量?

swift - 扩展 Foundation 类以符合 Swift 协议(protocol)

ios - SwiftUI 自定义图像修改器

swift - 将 Int 保存到核心数据中的正确方法?

java - 如何在较新版本的 Android 3.1 及更高版本中实现 Firebase Recycler Adapter?

android - Firebase 数据库更新数据删除旧子项