【发布时间】:2019-03-05 18:20:15
【问题描述】:
我正在使用在 ViewDidLoad() 方法中调用的 loadData() 填充我的 CollectionView。在这里,我将 Firebase 实时数据库中的所有数据解析为一个数组(帖子)。然后,在 cellForItemAt 方法中,我使用 indexPath.item 根据帖子数组中的信息相应地设置所有图像、标签和文本视图。很基本的东西。
但是,我的数据库中有两个表:posts 和 users。在帖子中,我只收集有关帖子的信息和作者的用户 ID。然后我想从用户那里获取数据,因为个人资料图片和用户名会随着时间而改变,所以我不想让它粘在数据库的帖子表中。
我之前遇到的问题:我从 loadData() 中的帖子中加载了数据,然后会根据帖子数组中保存的 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 时,它确实返回值。所以我有根据的猜测是数据没有及时获取。我现在正在寻找一种仅在加载帖子数组和用户数组时调用 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 隐藏几秒钟,但这完全取决于连接速度等,所以我认为应该有更合适的解决方案。
欢迎任何有用的想法!
【问题讨论】:
-
所以你只想在两个数组都填满数据时才加载集合视图,对吧?
-
是的,没错。
标签: ios arrays swift firebase-realtime-database uicollectionview