首页 > 解决方案 > 如何显示从数据库中获取的值?

问题描述

我正在使用 SwiftUI 开发 iOS 应用程序,但无法显示从数据库中获取的数据。

代码

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,我不知道如何更新这个值。如何显示从数据库中获取的值?

标签: iosfirebaseswiftui

解决方案


这是一个有点笼统的答案,因为我们将根据从 Firebase 读取的值更新 UI 元素。

Firebase 是异步的,并且值仅在闭包内的 Firebase 函数之后有效。

假设我们有一个简单的 SwiftUI 应用程序,它显示一个 Text 对象、一个单击按钮以从 Firebase 加载数据,然后是一个保存文本应该是什么的 var。

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"

推荐阅读