【问题标题】:Problems in fetching data using Firestore使用 Firestore 获取数据的问题
【发布时间】:2026-02-05 01:10:01
【问题描述】:

我在 YouTube 上看到了 Firebase 的教程,展示了如何在 firestore 和 swiftui (https://www.youtube.com/watch?v=f6u3AnOKZd0) 之间获取数据。这是我复制的完全相同的代码:

import SwiftUI
import Firebase
import FirebaseFirestore
import Foundation

class BooksViewModel: ObservableObject{
    @Published var books = [Book]()`
    
    private var db = Firestore.firestore()
    
    func fetchData(){
        db.collection("books").addSnapshotListener { (querySnapshot, error) in
            guard let documents = querySnapshot?.documents else{
                print("No results")
                return
            }
            self.books = documents.map { (queryDocumentSnapshot) -> Book in
                let data = queryDocumentSnapshot.data()
                
                let title = data["title"] as? String ?? ""
                let author = data["author"] as? String ?? ""
                let pages = data["pages"] as? Int ?? 0
                
                return Book(title: title, author: author, numberOfPages: pages)
          
            }
        }
    }

}

struct Book: Identifiable{
    var id:String = UUID().uuidString
    var title: String
    var author: String
    var numberOfPages: Int

}

struct Search: View {
   @ObservedObject private var viewModel = BooksViewModel()
  
    var body: some View {
        
        List(viewModel.books){ book in
            VStack{
                Text(book.title).font(.headline)
                Text(book.author).font(.subheadline)
                Text("\(book.numberOfPages) pages").font(.subheadline)                  
            }
        }
    }

}

问题是没有显示任何内容。 在 Firestore 中,我有“书籍”集合,在里面,对于每个自动 ID,我都有一个标题、一个作者和一个页面。 当我显示没有 Firestore 的列表时(正如他在视频开头显示的那样),它工作正常。但是,当我将它连接到 Firestore 时,它​​什么也没显示。但问题是它可能像“使用”一样连接,在 Firebase 的“Cloud Firestore”内,有 86 个读数、15 个记录和 8 个排除项的峰值。谁知道怎么解决?

11.0 Beta 大苏尔 12.1 Xcode

控制台上显示的内容: 2020-10-22 08:21:35.875930-0300 aplicativo[38475:1811559] 6.34.0 - [Firebase/Core][I-COR000008] 项目的 Bundle ID 与 'GoogleService-Info.plist 中的 Bundle ID 不一致',或选项中的捆绑 ID(如果您使用自定义选项)。为确保可以正确配置所有内容,您可能需要使 Bundle ID 保持一致。要继续使用此 plist 文件,您可以将应用的包标识符更改为“com.sigma2”。或者,您可以从 https://console.firebase.google.com/ 下载与您的包标识符匹配的新配置文件并替换当前的配置文件。 2020-10-22 08:21:36.176284-0300 aplicativo [38475:1811496] [] nw_protocol_get_quic_image_block_invoke dlopen libquic 失败 2020-10-22 08:21:37.083782-0300 aplicativo[38475:1811559] 6.34.0 - [Firebase/Analytics][I-ACS023007] Analytics v.60900000 已启动 2020-10-22 08:21:37.172409-0300 aplicativo[38475:1811559] 6.34.0 - [Firebase/Analytics][I-ACS023008] 要启用调试日志记录,请设置以下应用程序参数:-FIRAnalyticsDebugEnabled(请参阅“”) 2020-10-22 08:21:39.418386-0300 aplicativo[38475:1811558] 6.34.0 - [Firebase/Analytics][I-ACS800023] 没有待激活的快照。 SDK 名称:app_measurement 2020-10-22 08:21:42.157064-0300 aplicativo[38475:1811560] 6.34.0 - [Firebase/Analytics][I-ACS023012] 分析收集已启用 2020-10-22 08:21:42.157878-0300 aplicativo[38475:1811560] 6.34.0 - [Firebase/Analytics][I-ACS023220] 分析屏幕报告已启用。调用 +[FIRAnalytics logEventWithName:FIREventScreenView parameters:] 记录屏幕查看事件。要禁用自动屏幕报告,请在 Info.plist 中将标志 FirebaseAutomaticScreenReportingEnabled 设置为 NO(布尔值)

更新的控制台信息: 2020-10-22 11:18:52.062418-0300 aplicativo [49379:2031899] [] nw_protocol_get_quic_image_block_invoke dlopen libquic 失败 2020-10-22 11:18:53.463035-0300 aplicativo[49379:2031919] 6.34.0 - [Firebase/Analytics][I-ACS023007] Analytics v.60900000 已启动 2020-10-22 11:18:53.504736-0300 aplicativo[49379:2031919] 6.34.0 - [Firebase/Analytics][I-ACS023008] 要启用调试日志记录,请设置以下应用程序参数:-FIRAnalyticsDebugEnabled(请参阅“goo.gl” /RfcP7r") 2020-10-22 11:18:55.710625-0300 aplicativo[49379:2031900] 6.34.0 - [Firebase/Analytics][I-ACS800023] 没有待激活的快照。 SDK 名称:app_measurement 2020-10-22 11:19:03.453691-0300 aplicativo[49379:2031891] 6.34.0 - [Firebase/Analytics][I-ACS023012] 分析收集已启用 2020-10-22 11:19:03.556959-0300 aplicativo[49379:2031891] 6.34.0 - [Firebase/Analytics][I-ACS023220] 分析屏幕报告已启用。调用 +[FIRAnalytics logEventWithName:FIREventScreenView parameters:] 记录屏幕查看事件。要禁用自动屏幕报告,请在 Info.plist 中将标志 FirebaseAutomaticScreenReportingEnabled 设置为 NO(布尔值)

【问题讨论】:

  • 当您尝试执行此操作时,控制台会打印什么?
  • 尝试克隆github.com/peterfriese/bookspine 的repo(这是视频的基础),看看是否遇到同样的问题。
  • @purebreadd a 在问题中添加了它
  • Mateus,如果您能够使用我们在此处提供的帮助以及您在 GitHub 上共享的 repo 解决此问题,我建议您接受帮助您解决问题的答案之一问题,自己写一个答案,或者结束你的问题。

标签: swift firebase google-cloud-firestore swiftui


【解决方案1】:

尝试在主队列上分配books,比如

DispatchQueue.main.async {
    self.books = documents.map { (queryDocumentSnapshot) -> Book in
        let data = queryDocumentSnapshot.data()
        
        let title = data["title"] as? String ?? ""
        let author = data["author"] as? String ?? ""
        let pages = data["pages"] as? Int ?? 0
        
        return Book(title: title, author: author, numberOfPages: pages)
    }
}

【讨论】:

    【解决方案2】:

    感谢您添加日志,这很有帮助。

    第一条消息日志消息表明捆绑包 ID 存在问题:

    2020-10-22 08:21:35.875930-0300 aplicativo[38475:1811559] 6.34.0 - [Firebase/Core][I-COR000008] The project's Bundle ID is inconsistent with either the Bundle ID in 'GoogleService-Info.plist', or the Bundle ID in the options if you are using a customized options. To ensure that everything can be configured correctly, you may need to make the Bundle IDs consistent. To continue with this plist file, you may change your app's bundle identifier to 'com.sigma2'. Or you can download a new configuration file that matches your bundle identifier from https://console.firebase.google.com/ and replace the current one.
    

    本质上,应用的捆绑包 ID 与 GoogleService-Info.plist 文件中的捆绑包 ID 不匹配。确保捆绑包 ID 匹配。文档中的 Firebase Getting Started with iOS 页面显示了如何将 iOS 应用注册到您的 Firebase 项目。

    【讨论】:

    • 感谢您的回复。在我添加控制台信息后,我看到了它,并立即下载了正确的 GoogleService-info.plist。但是,问题仍然坚持发生。我将在问题中添加控制台上的更新信息。
    【解决方案3】:

    代码没问题,问题出在 Firebase 安全规则中。

    这是我用来让它工作的:

    rules_version = '2';
    service cloud.firestore {
      match /databases/{database}/documents {
        match /{document=**} {
          allow read, write: if
            request.time < timestamp.date(2020, 11, 25);
        }
      }
    }
    

    【讨论】: