Сохранение массива моментальных снимков Firebase в NSUserDefaults - PullRequest
0 голосов
/ 22 ноября 2018

Я использую 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.Причина, по которой я хочу сохранить их на устройстве, заключается в том, что пользователю не нужно постоянно загружать данные.Это хорошая идея?Это займет много памяти?

Буду признателен за любую помощь.

1 Ответ

0 голосов
/ 22 ноября 2018

Один из способов сохранить пользовательские классы / данные в 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...