Функция QueryEndingAtValue не работает правильно в Swift Firebase - PullRequest
0 голосов
/ 19 мая 2018

Я реализовывал код, который позволяет прокручивать страницы для извлечения данных по определенному количеству данных из базы данных Firebase.

Во-первых, затем ошибка говорит

Завершение приложения из-за необработанного исключения 'InvalidQueryParameter', причина: 'Невозможно использовать queryEndingAtValue: с другими типами, кроме строки, в сочетании с queryOrderedByKey'

Ниже приведен фактический код, который выдал вышеуказанную ошибку

static func fetchPostsWith(last_key: String?, completion: @escaping (([PostModel]?) -> Void)) {

    var posts = [PostModel]()
    let count = 2

    let ref = Database.database().reference().child(PATH.all_posts)
    let this_key = UInt(count + 1)
    let that_key = UInt(count)

    let this = ref.queryOrderedByKey().queryEnding(atValue: last_key).queryLimited(toLast: this_key)
    let that = ref.queryOrderedByKey().queryLimited(toLast: that_key)

    let query = (last_key != nil) ? this : that

    query.observeSingleEvent(of: .value) { (snapshot) in
        if snapshot.exists() {
            for snap in snapshot.children {
                if let d = snap as? DataSnapshot {
                    let post = PostModel(snapshot: d)
                    print(post.key ?? "")
                    posts.append(post)
                }
            }
            posts.sort { $0.date! > $1.date! }
            posts = Array(posts.dropFirst())
            completion(posts)
        } else {
            completion(nil)
        }
    }
}

Что он пытается сделать, это выбрать путь, где все сообщения хранятся с автоматическим идентификатором.Но ошибка продолжает выходить, поэтому я не знаю, что не так.Есть ли у вас какие-либо идеи?

 func tableView(_ tableView: UITableView, willDisplay cell: UITableViewCell, forRowAt indexPath: IndexPath) {
    // index is the last and last fetched then
    print(self.feeds.count - 1 == indexPath.row, "index ", self.hasFetchedLastPage, "has fetched last")
    if self.feeds.count - 1 == indexPath.row {
        let lastKey = self.feeds[indexPath.row].key
        if lastKey != self.previousKey {
            self.getFeeds(lastKey: lastKey)
        } else {
            self.previousKey = lastKey ?? ""
        }
    }
    print("Cell Display Number", indexPath.row)
}

func getFeeds(lastKey: String?) {
    print(self.isFetching, "is fetching")
    guard !self.isFetching else {
        self.previousKey = ""
        return
    }
    self.isFetching = true
    print(self.isFetching, "is fetching")
    FirebaseModel.fetchPostsWith(last_key: lastKey) { ( d ) in
        self.isFetching = false
        if let data = d {
            if self.feeds.isEmpty { //It'd be, when it's the first time.
                self.feeds.append(contentsOf: data)
                self.tableView.reloadData()
                print("Initial Load", lastKey ?? "no key")
            } else {
                self.hasFetchedLastPage = self.feeds.count < 2
                self.feeds.append(contentsOf: data)
                self.tableView.reloadData()
                print("Reloaded", lastKey ?? "no key")
            }
        }
    }
}

Я хочу реализовать TableView с поддержкой подкачки.Если вы можете помочь этому коду работать, это очень ценится.

1 Ответ

0 голосов
/ 19 мая 2018

Вы конвертируете last_key в число, а ключи всегда являются строками.Сообщение об ошибке говорит вам, что эти два типа несовместимы.Это означает, что вы должны преобразовать свой номер обратно в строку в вашем коде, прежде чем передавать его на запрос:

let this = ref.queryOrderedByKey().queryEnding(atValue: last_key).queryLimited(toLast: String(this_key))
let that = ref.queryOrderedByKey().queryLimited(toLast: String(that_key))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...