Существует ли простой способ публикации / извлечения данных из Firebase Swift с помощью вложенного пользовательского класса - PullRequest
0 голосов
/ 21 декабря 2018

Я пытаюсь найти способ легко опубликовать свой класс в Firebase, но не смог.Классы выглядят следующим образом:

class Events {

    static let TitleKey = "Title"
    static let CompletedKey = "isComplete"
    static let UserKey = "User"
    static let BackgroundKey = "Background"
    static let ReminderKey = "Reminder"
    static let DescriptionsKey = "Descriptions"

    var Title: String
    var Discriptions: String
    var isComplete = false
    var reminder : Reminder?
    var background : UIImage?
    let firebaseReference: DatabaseReference?

    init(Title: String, Discriptions: String, reminder: Reminder, background: String) {
        self.Title = Title
        self.Discriptions = Discriptions
        self.reminder = reminder
        self.background = UIImage(named: background)
        self.firebaseReference = nil
    }

    init(snapshot: DataSnapshot) {
        let dict = snapshot.value as! [String: Any]
        self.Title = dict[Events.TitleKey] as! String
        //self.reminder ??
        // here?
        self.background = dict[Events.BackgroundKey] as? UIImage
        self.Discriptions = dict[Events.DescriptionsKey] as! String
        self.firebaseReference = snapshot.ref
    }

    func toDictionary() -> Any {
        return [
            Events.TitleKey: self.Title,
            Events.DescriptionsKey: self.Discriptions
            // ?? here?
        ]
    }
}

class Reminder {

    var Daily : Date?
    var Weekly : Weekly?
    var Monthly : [String]?

}

class Weekly {

    var Week = [false,false,false,false,false,false,false]
    var Time : Date

    init(Week : [Bool], Time : Date) {
        self.Week = Week
        self.Time = Time
    }
}

Кажется, это было бы просто, если бы оно не было вложенным.Класс напоминания будет иметь только одну из ежедневных, еженедельных или ежемесячных настроек.Для публикации объекта я сделал что-то вроде этого:

let postRef = Database.database().reference().child("events").childByAutoId()
let reminderDate = Reminder()
let color = "02"
reminderDate.Weekly = Weekly(Week: [true,true,true,false,false,true,true], Time: Date())
let myEvent = Events(Title: "Chest Day", Discriptions: "100KG", reminder: reminderDate, background: color)

let postObject = [
    "Title" : myEvent.Title,
    "Description" : myEvent.Discriptions,
    "Background" : color,
    "Reminder" : [
        "Time" : reminderDate.Weekly!.Time.description,
        "Days" : [
            "Mon" : reminderDate.Weekly?.Week[0].description,
            "Tue" : reminderDate.Weekly?.Week[1].description,
            "Wed" : reminderDate.Weekly?.Week[2].description,
            "Thu" : reminderDate.Weekly?.Week[3].description,
            "Fri" : reminderDate.Weekly?.Week[4].description,
            "Sat" : reminderDate.Weekly?.Week[5].description,
            "Sun" : reminderDate.Weekly?.Week[6].description
        ]
    ]
] as [String:Any]

Как вы можете видеть, это только для еженедельного напоминания, мне придется делать почти один и тот же код снова ежедневно или ежемесячно.Для получения данных из Firebase это выглядит так:

   let postsRef = Database.database().reference().child("events")

   postsRef.observeSingleEvent(of: .value, with: { snapshot in
    var tempEvents = [Events]()

    for child in snapshot.children {
        if let childSnapshot = child as? DataSnapshot,
            let dict = childSnapshot.value as? [String:Any],
            let reminder = dict["Reminder"] as? [String:Any],
            let days = reminder["Days"] as? [String:Any],
            let mon = days["Mon"] as? String,
            let tue = days["Tue"] as? String,
            let wed = days["Wed"] as? String,
            let thu = days["Thu"] as? String,
            let fri = days["Fri"] as? String,
            let sat = days["Sat"] as? String,
            let sun = days["Sun"] as? String,
            let time = reminder["Time"] as? String,
            let background = dict["Background"] as? String,
            let description = dict["Description"] as? String,
            let title = dict["Title"] as? String {
            let tempReminder = Reminder()
            let dateFormatter = DateFormatter()

            dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss Z"
            let date = dateFormatter.date(from: time)

            tempReminder.Weekly = Weekly(Week: [mon.boolValue,tue.boolValue,wed.boolValue,thu.boolValue,fri.boolValue,sat.boolValue,sun.boolValue], Time: date!)
            tempEvents.append(Events(Title: title, Discriptions: description, reminder: tempReminder, background: background))

        }
    }
    return completion(tempEvents)
...