ios - 仅当加载所有数据时才加载 CollectionView 单元格

标签 ios arrays swift firebase-realtime-database uicollectionview

我正在使用在 ViewDidLoad() 方法中调用的 loadData() 填充我的 CollectionView。在这里,我将 Firebase 实时数据库中的所有数据解析为数组(帖子)。然后,在 cellForItemAt 方法中,我使用 indexPath.item 根据 posts 数组中的信息相应地设置所有图像、标签和 TextView 。非常基本的东西。

但是,我的数据库中有两个表:帖子和用户。在帖子中,我仅收集有关帖子和作者的用户 ID 的信息。然后我想从用户那里获取数据,因为个人资料图片和用户名可能会随着时间的推移而改变,所以我不想让它粘在数据库的 posts 表中。

我之前遇到的问题:我从loadData()内部的posts加载数据,然后根据posts数组中保存的userID在cellForItemAt方法中获取用户信息。这导致我的应用程序不稳定:滚动到新单元格启动了 cellForItemAt 方法,导致它请求数据,然后更新它。因此,由于必须下载信息,因此会出现延迟。绝对确定这是原因,因为我现在将其设置为默认图像(无个人资料图片图像)和默认用户名(“用户名”),使其再次变得非常顺利。

然后我继续获取 userData 并将其解析为另一个数组 (userInfo):

struct userData {
    var userFirstName: String
    var userLastName: String
    var userProfilePicURL: String
}

var userInfo = [String : userData]()

我可以使用它作为 userInfo[posts.userID],这正是我正在寻找的。我现在遇到的问题是 userInfo 没有及时填充,当我将数组转储到 cellForItemAt 中时返回 nil:

dump(userInfo[post.userID])

因此,这在加载应用程序时返回 nil,但是当我滚动并再次初始化 cellForItemAt 时,它确实返回值。所以我有根据的猜测是数据没有及时获取。我现在正在寻找一种仅在加载 posts 数组和用户数组时调用 cellForItemAt 的方法。

如何在 loadData 函数内向用户数组添加值,其中 dict["userID"] 是通过观察数据库中的帖子获得的:

Ref.child("users").child(dict["userID"] as! String).observeSingleEvent(of: .value) { (snapshot) in

    let userValues = snapshot.value as! [String: Any]
    userInfo[dict["userID"] as! String] = userData(userFirstName: userValues["userFirstName"] as! String, userLastName: userValues["userLastName"] as! String, userProfilePicURL: userValues["userProfilePicURL"] as! String)

}

我想确保在显示单元格之前将信息添加到数组中,以便他们可以相应地更改个人资料图片和用户名。我想在 cellForItemAt 方法中执行此操作。我考虑过使用计时器,隐藏我的 CollectionView 几秒钟,但这都取决于连接速度等,所以我认为应该有一个更合适的解决方案。

欢迎任何有用的想法!

最佳答案

您可以从 Storyboard 中实现此目的,无需加入 CollectionView 的委托(delegate)和数据源。在 Controller 类中,当您获取数据后,只需设置 collectionview.delegate = self 和 datasource 并重新加载该 Collection View 。

关于ios - 仅当加载所有数据时才加载 CollectionView 单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52577570/

相关文章:

ios - 快速将文本字段传递给第二个 View Controller 中的标签

ios - 一些 uitableviewcell 在我滚动 iPhone 之前不会显示所有数据

c - 使用大括号将数据分配给数组

快速解码 [字符串 : Any]

ios - Objective-C:执行完方法后获得单例类方法的结果吗?

c - 如何在 C 中连接两个数组?

java - 获取集合的所有子集

ios - 可以导入 RealmSwift,不能实例化

swift - 使用 (NSDate Predicate) 过滤 NSArray 直到过滤整个数组

ios - Linux ARM ELF 和 iOS ARM ELF 文件有什么区别?