在刷新之前,第一个Firebase查询项无法解决问题

时间:2018-06-06 19:17:51

标签: ios swift firebase firebase-realtime-database

我有一个firebase数据库,用于提取具有最高整数值的50个用户,并从最高到最低显示它们。当我第一次进入排行榜视图时会出现此问题。订单应该显示jlewallen18在顶部然后appledev。但是在第一次加载时,appledev位于顶部,直到我退出并再次打开排行榜(代码位于底部)。

enter image description here

排行榜代码:

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)

1 个答案:

答案 0 :(得分:2)

这里的问题与这行代码有关......

let queryRef = Database.database().reference().child("users").queryOrdered(byChild: "ranking").queryLimited(toLast: 50)

将此限制更改为10会使应用按预期工作,这是一个临时的“修复”。

如果我们弄清楚该限制导致问题的原因,我一定会更新此答案。