我使用Firebase存储来存储用户'个人资料图片,我试图在UITableView中显示这些个人资料图片。
问题是,一旦图像完成检索,我就无法在代码中找到重新加载表格视图数据的好点。任何时候我调用tableView.reloadData(),它似乎是在图像完成下载之前,因为表格单元格的图像视图留空。
目前,我正在遍历将在桌面视图上显示的用户并通过调用此功能获取他们的个人资料照片:
func loadProfilePicture(userId: String, index: Int) {
// Load the stored image
usersRef.child(userId).observeSingleEvent(of: .value, with: { (snapshot) in
// Load user's profile picture from Firebase Storage if it exists (exists if the user has a profPic URL in the database)
if snapshot.hasChild("profilePictureUrl") {
self.usersStorageRef.child(userId + "/ProfilePicture").data(withMaxSize: 20*1024*1024, completion: {(data, error) in
let storagePicture = UIImage(data:data!)
// Sets the user's profile picture to the loaded image
self.nearbyUsers[index].profilePicture = storagePicture
})
} else {
print("Error -- Loading Profile Picture")
}
DispatchQueue.main.async {
self.tableView.reloadData()
}
})
}
nearbyUsers
是我的表格视图的数据源,而我的tableview的cellForRowAt函数如下所示:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: "UserCell", for: indexPath) as! UserTableViewCell
let user = nearbyUsers[indexPath.row]
cell.labelUserName.text = user.firstName + " " + user.lastName
print("refreshing")
if user.profilePicture != nil {
cell.imageViewProfilePicture.image = user.profilePicture
}
return cell
}
我已尝试过目前代码中的一些变体,例如:
- 在每个用户调用loadProfilePicture函数的循环之后重载表视图数据
- 重新发送表格视图的数据而不分派到主线程
但无济于事
那么如何在确保所有个人资料图片都已加载的同时重新加载我的表格视图数据呢?
谢谢!