将 Firebase 数据库数组返回到另一个函数但返回空

Posted

技术标签:

【中文标题】将 Firebase 数据库数组返回到另一个函数但返回空【英文标题】:Return Firebase Database Array To Another Function But Returns Empty 【发布时间】:2020-11-24 23:39:00 【问题描述】:

我正在制作一个提示卡应用程序。我将我的数据库添加到一个数组中,但是在另一个函数中调用该数组(我想对数组进行更改)时,它返回空。我在这个主题上做了很多搜索,发现我必须使用完成处理程序,我认为我已经完成了。那里有很多关于这个主题的信息,例如https://firebase.googleblog.com/2018/07/swift-closures-and-firebase-handling.html,但我似乎无法让它适用于我的应用程序。 提示卡视图:

import SwiftUI

struct CueCardView: View 

var viewModel = CueCardViewModel()
@State private var isShowingAnswer = false

var body: some View 
    ZStack
        RoundedRectangle(cornerRadius: 25, style: .continuous)
            .fill(Color.white)
        VStack
              Text("heloo")
                .onAppear
                    self.viewModel.initializeCues()
                
        
        .padding(20)
        .multilineTextAlignment(.center)
    
    .onTapGesture 
        self.isShowingAnswer.toggle()
    
    
    





struct C1_Previews: PreviewProvider 
static var previews: some View 
    
    CueCardView().previewDevice("iPhone 12")



提示牌型号:

import SwiftUI

struct CueCardModel : Identifiable 
var id: String = UUID().uuidString
var term: String
var answer: String

下载数据:

import SwiftUI
import Firebase

var dbRef = Firestore.firestore()
struct DataDownloader 
func downloadCues(completion: @escaping ([CueCardModel]) -> Void) 
    var array = [CueCardModel]()
    dbRef.collection("Cues").getDocuments()(snap, err) in
        if let err = err 
            print(err)
         else 
            guard let snap = snap else return
            
                for doc in snap.documents 
                let id = doc.documentID
                let term = doc.get("term") as! String
                let answer = doc.get("answer") as! String
                let cue = CueCardModel(id: id, term: term, answer: answer)
                array.append(cue)
            
            completion(array)
        
    


提示卡视图模型:

import SwiftUI
import Firebase

class CueCardViewModel: ObservableObject 

let dataDownloader = DataDownloader()

func initializeCues() 
    dataDownloader.downloadCues()  array in
        print(array)
    
    


【问题讨论】:

您应该在整个函数中添加打印语句,并查看它被捕获的位置。我将首先在 downloadCues 的开头添加一个打印以确保它被调用..在您检查快照值的函数中的另一个打印..并且可能在 initializeCues 的开头添加一个打印以确保它被调用。快速浏览一下,您可能需要在 CueCardViewModel 中添加一个 init() 才能真正调用 initializeCues? 我总是忽略的好建议。它似乎没有在 DataDownloader 文件的 snap.documents 循环中运行 for doc。 是否进入了“guard let snap = snap else return”语句?我猜它会回到那里。这意味着该函数没有在 dbRef.collection("Cues") 处获取快照。确保您访问的是正确的路径/集合。我认为它区分大小写(“提示”与“提示”)。 你是个读心者!我的数据库集合被命名为“Cue”而不是“Cues”。我已经为此工作了大约 4 个小时。谢谢! 哈哈我自己也遇到过类似的问题。我也为您发布了带有建议的答案。干杯! 【参考方案1】:

确保查询路径与您在 Firebase 中设置的路径完全相同。我建议为所有集合的名称创建一个结构(可能还有每个集合中每个字段的附加结构),以避免在进行查询时输入显式字符串。将所有数据库字段保持小写也是一种常见做法,以避免区分大小写的字符串问题。例如:

用集合创建一个全局结构:

struct DatabaseCollections 
    static let cue = "cue"
    static let nextCollection = "collection_two"

用法:

dbRef.collection(DatabaseCollections.cue).getDocuments...

【讨论】:

以上是关于将 Firebase 数据库数组返回到另一个函数但返回空的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Firebase iOS 中的数据从 TableViewController 传递到另一个 ViewController

如何在 Vue.js 中显示 Firebase 数组项

如何在firebase中处理异步调用

函数没有返回,Swift Firebase

数组中的 Firebase Promise 未及时解决

如何将一个char数组中元素插入到另一个char数组中指定元素后面,在java语言环境,但不能使用java的内置函数