Я пытаюсь найти способ легко опубликовать свой класс в 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)