Проблема с первым элементом запроса Firebase вышла из строя до обновления - PullRequest
0 голосов
/ 06 июня 2018

У меня есть база данных 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 голосов
/ 07 июня 2018

Проблема здесь связана с этой строкой кода ...

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

Изменение этого предела до 10 заставляет приложение работать должным образом, что является временным «исправлением».

Если мы выясним, почему этот лимит вызывает проблемы, я обязательно обновлю этот ответ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...