Загрузите один объект Firestore и сохраните его в объекте struct / class - PullRequest
0 голосов
/ 24 июня 2019

Я кодирую с января 2019 года, и это мой первый пост здесь.

Я использую Swift и Firestore. В моем приложении есть табличное представление, в котором я отображаю события, загруженные из одного документа, с массивом событий внутри, как [String: [String: Any]]. Если пользователь хочет получить больше информации о событии, он нажимает на него. В фоновом режиме TableViewController откроет новый «DetailEventViewController» с переходом и передаст ему значение eventID в повернутой ячейке.

Когда пользователь находится на экране DetailViewController, приложение загрузит новый документ с EventID в качестве ключа для документа.

Я хочу сохранить эти данные из Firestore в структуре под названием Event. Для этого примера только с Event (eventName: String).

Когда я получаю все данные, я могу распечатать их напрямую, но не могу сохранить их в переменной и распечатать позже. Я действительно не знаю почему. Если я печатаю структуру INSIDE, скобки, где я получаю данные, работают, но если я сохраняю их в переменную и пытаюсь использовать эту переменную, она говорит, что ее ноль.

Так, как я могу извлечь данные из Firestore и сохранить только в одном ValueObject (var currentEvent = Event? -> currentEvent = Event.event (для: data as [String: Any]))

Я выполняю поиск в google, firebaseDoc и stackoverflow, но ничего не нашел по этому поводу, поэтому я попытался сохранить все отдельные данные в отдельном значении.

// Struct

struct Event {
var eventName: String!

static func event(for eventData: [String:Any]) -> Event? {
guard let _eventName = eventData["eventName"] as? String    
else {
print("error")
return nil
}
return Event(eventName: _eventName)
}

// TableView VC это должно работать

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    if segue.identifier == "ShowEventDetailSegue" {
  if let ShowEvent = segue.destination as?                                               DetailEventViewController, let event = eventForSegue{
            ShowEvent.currentEventId = event.eventID
        }
    }
}

// DetailViewController

var currentEvent = Event()
var currentEventId: String?

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    guard let _eventID = currentEventId else {
        print("error in EventID")
        return}

    setupEvent(eventID: _eventID) /* currentEvent should be set here                 */
    setupView(event: currentEvent) /* currentEvent has after     "setupEvent" the value of nil */
}

func setupEvent(eventID: String) {

let FirestoreRef =     Firestore.firestore().collection("events").document(eventID)

FirestoreRef.getDocument { (document, error) in
        if let err = error {
            debugPrint("Error fetching docs: \(err)")
            SVProgressHUD.showError(withStatus: "Error in Download")
        }else {
            if let document = document, document.exists {
                guard let data = document.data() else {return}

            let eventData = Event.event(for: data as [String:Any])

                print(eventData)
//here all infos are printed out - so I get them

                self.currentEvent = eventData! 

//Here is the error.. I can't save the fetched Data in my single     current Event 
} else {
                SVProgressHUD.showError(withStatus: "Error")
            }
        }
    }


}

func setupView(event: Event) {
self.titleLabel.text = event.eventName
}

Я ожидаю, что функция setupEvents передаст currentEvent в DetailViewController значение SINGLE, поскольку его документ SINGLE не является массивом. Так что я могу использовать это единственное Eventvalue для дальнейших действий. Как начать новый переход для нового ViewController и просто отправить событие туда, а не

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