Как отобразить значение, полученное из базы данных? - PullRequest
0 голосов
/ 16 января 2020

Я разрабатываю приложение iOS с SwiftUI, и у меня возникают проблемы с отображением данных, извлеченных из базы данных.

Код

import SwiftUI
import Firebase
import FirebaseDatabase

var ref = Database.database().reference()

class Observe {
    static func currentSingleEventObserve(completion: @escaping ((String?) -> ())) {
        let path = "supersonic/current"
        let ref = Database.database().reference().child(path)
        _ = ref.observeSingleEvent(of: .value, with: { snapshot in
            let temp = (snapshot.value! as AnyObject).description
            completion(temp)
        })
    }
}

struct CurrentDistance: View {
    var value: NSDictionary?
    var refHandle: UInt = 0

    @State var distance: String

    init() {
        Observe.currentSingleEventObserve(completion: { temp in
            self.distance = temp    // I want to mutate self.distance here
        })
    }

    var body: some View {
        VStack {
            Text("Distance")
            Text(self.distance)
        }
    }
}

struct CurrentDistance_Previews: PreviewProvider {
    static var previews: some View {
        CurrentDistance()
    }
}

База данных

|-supersonic
    |- current: 30

Проблема

Я хочу изменить self.distance в инициализаторе. При попытке изменить self.distance в закрытии я получил ошибку Escaping closure captures mutating 'self' parameter, и я не знаю, как обновить значение. Как я могу отобразить значение, извлеченное из базы данных?

1 Ответ

0 голосов
/ 18 января 2020

Это несколько общий ответ c, так как мы только собираемся обновить элемент пользовательского интерфейса на основе значения, считанного из Firebase.

Firebase является асинхронным, и значения действительны только после функции Firebase, внутри замыкания.

Предположим, у нас есть простое приложение SwiftUI, которое отображает объект Text, кнопку, которую нужно щелкнуть, чтобы загрузить данные из Firebase, а затем переменную, содержащую текст, который должен быть.

struct ContentView: View {
   @State var buttonText = "Initial Button Label"

    var body: some View {
        VStack {
            Text(buttonText)

            Button(action: {
                self.readFirebase()
            }) {
                Text("Click Me!")
            }
        }
    }

    func readFirebase() {
        let ref = my_firebase_ref
        let textRef = ref.child("string_node")
        textRef.observeSingleEvent(of: .value, with: { snapshot in
            let myText = snapshot.value as? String ?? "No String"
            self.buttonText = myText
        })
    }
}

Вот моя структура Firebase

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