Swift 4 / Firebase - чтение и хранение двойных вложенных элементов из базы данных в реальном времени в разных массивах - PullRequest
0 голосов
/ 17 сентября 2018

Я действительно борюсь с тем, как читать и хранить мои данные из базы данных Firebase в реальном времени.Вот как выглядит моя база данных:

image

text json
{
 "Live": {
    "Today": {
      "121321": {
        "title": "rnd",
        "description": "blah blah blah",
        "stamp": 1111
      },
      "121441": {
        "title": "arnd",
        "description": "blh blah blah",
        "stamp": 134
      }
    },
    "Tomorrow": {
      "143821": {
        "title": "brnd",
        "description": "blh blah blah",
        "stamp": 1134
      }
    },
    "ThisWeek": {
      "18934": {
        "title": "drnd",
        "description": "blh blh blah blah blah",
        "stamp": 237812
    },
      "323123": {
        "title": "crnd",
        "description": "blh blh blah blah",
        "stamp": 138921
     }
   }
  }
}

Я выделил то, что я называю событиями, зеленым цветом.События имеют заголовок, описание и штамп.У меня тогда есть внешнее гнездо сегодня, завтра и на этой неделе.Сегодня, завтра и на этой неделе каждый из отдельных словарей содержит любое количество событий.

Я создал класс в отдельном файле swift:

class Event: NSObject {

    var EventTitle: String?
    var EventDescription: String?
    var EventStamp: Int?
    }

Я хочу иметь три массива,Первый массив будет иметь все события для «сегодня», второй будет иметь все события для «завтра», а третий будет иметь все события для «этой недели».В конечном итоге мне нужно будет отсортировать события в каждом массиве по штампам.Тем не менее, я застрял на том, как преобразовать снимки базы данных firebase в события, а затем поместить все события в массив.Пока мой код'ввести' Int 'при принуждении. "Я посмотрел на другие ответы, но я полагаю, что моя ситуация отличается, так как у меня есть двойные вложенные данные, и я хочу назначить разные массивы.Я использую swift 4

Спасибо

--- Если я распечатаю (todaysnap), я получаю

Snap (Today) {
121321 =     {
    title = rnd;
    description = blah blah blah;
    stamp = 1111
};
121441 =     {
    title = arnd;
    description = blh blah blah;
    stamp = 134
};

} ​​Выполнение печати (todaysnap.value) даетмне то же самое, кроме типа «Необязательно» вместо «Snap (Today)»

1 Ответ

0 голосов
/ 18 сентября 2018

Вот полный код для чтения всех данных в узле Live и помещения событий Today, Tomorrow и ThisWeek в отдельный массив

.
var todayArray = [String]()
var tomorrowArray = [String]()
var thisWeekArray = [String]()

let liveRef = self.ref.child("Live")
liveRef.observeSingleEvent(of: .value, with: { snapshot in

    let todaySnap = snapshot.childSnapshot(forPath: "Today")
    for todayChild in todaySnap.children {
        let todayChildSnap = todayChild as! DataSnapshot
        let todayDict = todayChildSnap.value as! [String: Any]
        let title = todayDict["title"] as! String
        todayArray.append(title)
    }

    let tomorrowSnap = snapshot.childSnapshot(forPath: "Tomorrow")
    for tomorrowChild in tomorrowSnap.children {
        let tomorrowChildSnap = tomorrowChild as! DataSnapshot
        let tomorrowDict = tomorrowChildSnap.value as! [String: Any]
        let title = tomorrowDict["title"] as! String
        tomorrowArray.append(title)
    }

    let thisWeekSnap = snapshot.childSnapshot(forPath: "ThisWeek")
    for thisWeekChild in thisWeekSnap.children {
        let thisWeekChildSnap = thisWeekChild as! DataSnapshot
        let thisWeekDict = thisWeekChildSnap.value as! [String: Any]
        let title = thisWeekDict["title"] as! String
        thisWeekArray.append(title)
    }

    print("Today")
    for today in todayArray {
        print("  " + today)
    }

    print("Tomorrow")
    for tomorrow in tomorrowArray {
        print("  " + tomorrow)
    }

    print("This Week")
    thisWeekArray.map { print("  " + $0) } //gettin' all swifty here
})

и вывод

Today
  rnd
  arnd
Tomorrow
  brnd
This Week
  drnd
  crnd

Однако ... Я бы, наверное, изменил структуру:

Live
  event_0  //generated with childByAutoId
    title: "rnd"
    timestamp: "20180918"
  event_1
    title: "brnd"
    timestamp: "20180919"

потому что теперь вы можете делать запросы на каждом узле, извлекая сегодняшние события. Завтрашние события или событие ThisWeeks или любой другой день или диапазон, который вам нравится.

Я собираюсь загружать новые данные каждый день, так что сегодня, завтра и это неделя будет обновляться каждый день

и с этой структурой все, что вам нужно будет сделать, это добавить узлы, и ваши запросы выяснят, какие узлы для каких периодов времени.

Поскольку ваш класс Event не выполняет никакой обработки и, по сути, представляет собой просто структуру для хранения ваших данных, как насчет структуры:

struct EventStruct {
   var EventTitle: String?
   var EventDescription: String?
   var EventStamp: Int?
}

Затем добавьте события в массив:

let title = thisWeekDict["title"] as! String
let desc = thisWeekDict["desc"] as! String
let stamp = thsWeekDict["stamp"] as! String
let anEvent = Event(title: title, desc: desc, stamp: stamp)
thisWeekArray.append(anEvent)

или оставьте его как класс и просто передайте снимок, и класс назначит свойства из снимка. В любом случае, пожалуйста, добавьте проверку ошибок для nil.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...