swift - Firebase Firestore 文档计数返回为零值
问题描述
我正在使用 Firebase Firestore 开发一个 iOS 应用程序。但是,我遇到了一个问题,当我返回文档计数值时,它总是为零。如果我执行打印方法,它会打印集合中的项目
// Variable
var itemsInttt: Int
// Collectionsview
func collectionView(_ collectionView: UICollectionView, numberOfItemsInSection section: Int) -> Int {
dataBase.collection("Channels").getDocuments { (document, error) in
self.itemsInttt = (document?.documents.count)!
// The print works
print((document?.documents.count)!)
self.itemsInttt = documentData!.count
}
// This is where it crashes
return itemsInttt
}
这是完整的viewcontroller.swift
文件
https://github.com/Ashwin-Paudel/stackoverflowviewcontroller/blob/main/ViewController.swift
代码有点乱
你能告诉我我错在哪里,甚至提供示例代码吗
谢谢!
解决方案
我的建议:
- 不要将异步方法输入到集合视图的委托中;给它一个数组计数,如
someArray.count
. - 在使用您的
getDocuments
方法重新加载集合视图之前填充该数组。当 Firestore 返回并且您已填充该数组时,请重新加载集合视图。委托方法将使用该数组的大小来确定要呈现多少个单元格。 - 始终从 Firestore 安全地解包快照,切勿强制解包它们,尤其是当您甚至没有检查错误时。
- 了解异步函数及其工作原理;当你这样做时,事情会变得更有意义。请记住,在
numberOfItemsInSection
加载视图控制器时会立即调用委托方法,因此在其中放置异步方法是没有用的,因为调用 Firestore 并获得响应需要时间。
推荐阅读
- php - 来自 postfix 的电子邮件在 gmail 上被标记为垃圾邮件
- r - 如何在 R 中的条形图标签上添加 $ 符号?[包括图像和代码]
- javascript - 不推荐使用 jsapi 加载程序加载 Maps API
- angular - Angular 中的自动完成指令
- javascript - Highstock:如何禁用 rangeSelector 响应规则以在元素之间断线?
- java - 使用反射访问 Kotlin Data 类时出现 NoSuchMethodException
- python - PyQt5小部件旨在透明显示QVideoPlayer通过视频并采用QMainWindow背景
- r - 使用两列(字符变量)唯一拆分
- python - 具有多个数据库的大规模金字塔应用程序
- swift - 为什么保存托管对象上下文更改 isDeleted 值?