在刷新之前,第一个 Firebase 查询项出现问题
Posted
技术标签:
【中文标题】在刷新之前,第一个 Firebase 查询项出现问题【英文标题】:Issue with first Firebase query item out of order until refresh 【发布时间】:2018-06-06 19:17:51 【问题描述】:我有一个 firebase 数据库来提取 50 个具有最高整数值的用户,并从最高到最低显示它们。当我第一次进入排行榜视图时会出现这个问题。该订单应在顶部显示 jlewallen18,然后是 appledev。但是在第一次加载时,appledev 位于顶部,直到我退出并再次打开排行榜(代码在底部)。
排行榜代码:
class LeaderboardViewController: UIViewController, UITableViewDelegate, UITableViewDataSource
@IBOutlet weak var leaderboardTableView: UITableView!
var userModel : [User] = [User]()
let pipeline = ImagePipeline
//config settings for image display removed for brevity
override func viewDidLoad()
super.viewDidLoad()
leaderboardTableView.delegate = self
leaderboardTableView.dataSource = self
fetchUsers()
func fetchUsers()
let queryRef = Database.database().reference().child("users").queryOrdered(byChild: "ranking").queryLimited(toLast: 50)
queryRef.observe(.childAdded, with: (snapshot) in
if let dictionary = snapshot.value as? [String : AnyObject]
let user = User(dictionary: dictionary)
self.userModel.append(user)
DispatchQueue.main.async(execute:
self.leaderboardTableView.reloadData()
)
)
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int
return userModel.count
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell
let cell = tableView.dequeueReusableCell(withIdentifier: "leaderboardTableCell", for: indexPath) as! LeaderboardTableCell
if userModel.count > indexPath.row
if let profileImageURL = userModel[indexPath.row].photoURL
let url = URL(string: profileImageURL)!
var options = ImageLoadingOptions()
options.pipeline = pipeline
options.transition = .fadeIn(duration: 0.25)
Nuke.loadImage(
with: ImageRequest(url: url).processed(with: _ProgressiveBlurImageProcessor()),
options: options,
into: cell.userImage
)
cell.userName.text = userModel[indexPath.row].username
cell.watchTime.text = "\(String(describing: userModel[indexPath.row].watchTime!))"
cell.ranking.text = "\(indexPath.row + 1)"
cell.userImage.layer.cornerRadius = cell.userImage.frame.size.width/2
return cell
我认为这可能是因为我在个人资料页面视图和排行榜视图中都使用了相同的型号名称 userModel
,但是当我在排行榜视图中更改型号名称时,没有任何变化。我还能分享什么来提供帮助?谢谢!
编辑:这是我打印出watchTime
后的控制台输出,这是我对其进行排名的整数:
HERES WHERE I OPEN LEADERBOARD PAGE FIRST:
Optional(28)
Optional(247)
Optional(0)
Optional(0)
Optional(0)
Optional(0)
AFTER I GO BACK AND CLICK TO VIEW LEADERBOARD AGAIN:
Optional(247)
Optional(28)
Optional(0)
Optional(0)
Optional(0)
Optional(0)
【问题讨论】:
如果在获取用户之前将数组设置为空会发生什么? @CaseyWest 好问题,我尝试在fetchUsers()
的查询上方添加userModel.removeAll()
,但不幸的是返回了相同的结果
该死...如果您跟踪用户数组,它会首先加载 currentUser,然后根据 queryOrderedBy ref 追加?我可能需要查看您的项目以提供更多帮助。对不起,伙计。
@CaseyWest 是的,我在原始问题中添加了控制台输出。很奇怪,因为这个确切的代码在我的主页上完美运行
@CaseyWest 所以它取决于谁登录了。我从我的 appledev 帐户切换到我的 jlewallen 用户帐户,现在它在初始排行榜页面加载时首先将 jlewallen 放在首位......嗯。这就像它首先缓存并显示登录用户
【参考方案1】:
这里的问题和这行代码有关……
let queryRef = Database.database().reference().child("users").queryOrdered(byChild: "ranking").queryLimited(toLast: 50)
将此限制更改为 10 可使应用按预期工作,这是一个临时“修复”。
如果我们弄清楚为什么这个限制会导致问题,我一定会更新这个答案。
【讨论】:
标记为正确回答了原始问题。我想补充一点,当只有 6 个帐户时,此行尝试查询 50 个帐户。 @JordanLewallen 只是想知道你是否曾经与超过 10 人合作过? 从未这样做过:/联系了 Firebase 支持,但他们无法复制……真的很奇怪,似乎是特定于项目的 @JordanLewallen 为什么不接受?想要我进一步研究吗? 奇怪,不知道为什么它不被接受(可能是当我在手机上回复最近的消息时)。但是,我想,是的,它不应该被标记为正确,因为它并不能完全解决问题:/如果你能再看看它,我会很高兴的,你想要最新的版本吗?以上是关于在刷新之前,第一个 Firebase 查询项出现问题的主要内容,如果未能解决你的问题,请参考以下文章
为啥我的 Firebase 'child_added' 事件出现乱序?
如何使用 Firebase 查询的结果最终在 Android Studio 中填充 ListView