Verhalten bei Funktion und Rückgabewerte innerhalb einer for schleife im Datasnapshot von Firebase

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Verhalten bei Funktion und Rückgabewerte innerhalb einer for schleife im Datasnapshot von Firebase

    Hallo Gruppe,

    ich beschäftige mich seit ein paar Tagen und Wochen mit Swift. Ich habe Tutorials geübt und auch im Playground mit ausgetobt. Nun sitze ich an einer kleinen App die Werte von einer Datenbank (Firebase) holt. Nun habe ich eine Funktion in einem extra View die mit einen verglichenen Wert in eine Variable schreiben soll. Innerhalb der For-Schleife über die Einträge bekomme ich den Wert angezeigt. Außerhalb ist meine Variable leer. Leider komme ich nicht ganz zurecht warum das nicht funktioniert. Versuchte es auch mit einem String return. Aber dieser ist immer leer. Vielleicht kann mir jemand erklären woran ich mich gerade gedanklich aufhänge. Hier die Schnippsel Code. Ich habe die print methode kommentiert wo ich einen richtigen wert bekomme und wo nicht. Ich hab es mit rückgabewerte versucht aber bekomme immer ein nil. Innerhalb der for schleife funktioniert der rückgabewert richtig.
    Woran scheitert mein Gehirn gerade das ich den Fehler nicht verstehen ?(

    C-Quellcode: Func getTimestampFromDatabase

    1. Schleife aus einer func:
    2. for i in stride(from: iLast, to: iFirst, by: +1) {
    3. getTimestampFromDatabase(with: livingRoom[i].timestampKey)
    4. let value = ChartDataEntry(x: Double(i), y: Double(livingRoom[i].temperature)!)
    5. lineChartTemperatureEntry.append(value)
    6. }
    7. func getTimestampFromDatabase(with key: String) {
    8. var databaseQuery: DatabaseQuery!
    9. databaseQuery = FirebaseHelper.sensorLivingRoomReference.child("timestamp")
    10. databaseQuery.observe(.value) { (snapshot) in
    11. if let timestampEntries = snapshot.children.allObjects as? [DataSnapshot] {
    12. for timestampEntry in timestampEntries {
    13. if key == timestampEntry.key {
    14. self.timeString = self.setLastValueTimeDateFromDatabase(with: timestampEntry.value as! Int)
    15. //print(self.timeString) -> GIBT MIR EINEN RICHTIGEN WERT IN DER KONSOLE ZURÜCK
    16. } else {
    17. //print("Keine Übereinstimmung")
    18. }
    19. }
    20. }
    21. print(self.timeString) //-> GIBT MIR EINEN RICHTIGEN WERT IN DER KONSOLE ZURÜCK
    22. }
    23. //print(self.timeString) -> GIBT MIR nil AUF DER KONSOLE AUS
    24. //print(timeString) -> GIBT MIR nil AUF DER KONSOLE AUS
    25. }
    Alles anzeigen
  • AlexLojewski schrieb:

    Innerhalb der For-Schleife über die Einträge bekomme ich den Wert angezeigt. Außerhalb ist meine Variable leer.
    Das stimmt doch gar nicht: Laut Deiner Print-Kommentare ist der Wert auch ausserhalb der for-Schleife korrekt gefüllt, nicht aber ausserhalb des umschließenden Blocks.

    Ohne Swift- und Firebase-Erfahrung kann ich nur (stark) vermuten, aber wird diese Block evt. asynchron verarbeitet, so dass dieser noch gar nicht beendet wurde - und self.timeStamp daher auch noch nicht zugewiesen wurde - wenn Dein unteres Print-Statement ausgeführt wird?

    Mattes
    Diese Seite bleibt aus technischen Gründen unbedruckt.
  • MyMattes schrieb:

    Ohne Swift- und Firebase-Erfahrung kann ich nur (stark) vermuten, aber wird diese Block evt. asynchron verarbeitet, so dass dieser noch gar nicht beendet wurde
    Guten Morgen @MyMattes

    Danke für die Hilfe :) das Wort asynchron hat mir komplett gefehlt. Glaube habe einen Ansatz gefunden um dieses Problem zu beheben. Ich denke ich werde mal eine completion benutzen um das asynchrone quasi zu umgehen und eine Fertigstellung abzuwarten.

    Danke nochmal