Получение четырех случайных, но уникальных документов из облачного хранилища пожаров - Swift - PullRequest
0 голосов
/ 15 мая 2019

Попытка использовать Дэн МакГрат, предложенный Решение для распознавания документов для запроса Firestore для случайных документов, вместе с предложением Rinse in Repeat для извлечения нескольких случайных документов.

Этот код иногда приходит с нулевыми документами (не всегда возвращает документ). Я думаю, что мой запрос выключен, и я ищу рекомендации / идеи о том, как решить эту проблему - Спасибо

func getRandomPlateOne() {
        let plateOneRef = db.collection("plates")
        plateOneRef.whereField("random", isGreaterThan: randomNumberOne).order(by: "random").limit(to: 1).getDocuments { (snapshot, error) in
            if snapshot!.isEmpty {
                plateOneRef.whereField("random", isLessThanOrEqualTo: self.randomNumberOne).order(by: "random", descending: true).limit(to: 1)
            } else {
                guard let documents = snapshot?.documents else {return}
                for document in documents {
                    let data = document.data()
                    let newPlate = Plate.init(data: data)
                    self.randomPlateOne = [newPlate]
                    print(self.randomPlateOne)
                }
            }
        }
    }

РЕДАКТИРОВАТЬ - хотя я выяснил, что передача случайного числа в переменную и последующее использование этой переменной в моем запросе обеспечит уверенность в том, что используется одно и то же случайное число независимо от того, идет ли запрос большеThanA или LessThanAndEqualTo. Все еще получает случайный ноль от Firestore. Мой запрос все еще должен быть отключен.

Новый код:

func getRandomPlateOne() {
        let collectionRef = db.collection("plates")
        collectionRef.whereField("random", isGreaterThan: randomNumberOne).order(by: "random").limit(to: 1).getDocuments { (snapshot, error) in
            if snapshot!.isEmpty {
                collectionRef.whereField("random", isLessThanOrEqualTo: self.randomNumberOne).order(by: "random", descending: true).limit(to: 1)
            } else {
                guard let documents = snapshot?.documents else {return}
                for document in documents {
                    let data = document.data()
                    let newPlate = Plate.init(data: data)
                    self.randomPlateOne = [newPlate]
                    print(self.randomPlateOne)
                    }
                }
            }
        }

func generateARandomNumber() {
        randomNumberOne = UInt64.random(in: 0 ... 9223372036854775807)
        }

var randomNumberOne: UInt64 = 0

РЕДАКТИРОВАТЬ - Функция развивалась. Я все еще не могу сделать шаг между проверкой, вернул ли первое условие документ или нет, и переходом к иногда необходимому второму запросу. Это работает, но я использую исправленный UInt64.

var randomNumberOne: UInt64 = 8190941879098207969 (higher than any other in my collection)

func getRandomPlateOne() {
        let randomPlateRef = db.collection("plates")

            randomPlateRef.whereField("random", isGreaterThan: randomNumberOne).order(by: "random").limit(to: 1).getDocuments { (snap, error) in
                if snap!.isEmpty {
                randomPlateRef.whereField("random", isLessThanOrEqualTo: self.randomNumberOne).order(by: "random", descending: true).limit(to: 1).getDocuments { (snap, error) in
                    print("This is the snapshot from the second query. \(snap!) ")
                    guard let documents = snap?.documents else {return}
                    for document in documents {
                        let data = document.data()
                        let newPlate = Plate.init(data: data)
                        self.plates.append(newPlate)
                        print(self.plates)
                    }
                }
            }
        }

1 Ответ

0 голосов
/ 15 мая 2019

Как я уже сказал в своем предыдущем комментарии, я использовал два разных случайных числа для обработки диапазона документов или уменьшения диапазона документов, когда это необходимо.

Я создал функцию generateARandomNumber, которая вызывается в моей функции viewDidLoad.

func generateARandomNumber() {
        randomNumber = UInt64.random(in: 0 ... 9223372036854775807)
    }

Затем это число передается в переменную, которая используется в моем getARandomPlate (документ Firestore).

Сейчас я использую одно и то же случайное число, независимо от того, выполняется ли поиск документа со случайным номером: GreaterThan, который viewDidLoad сгенерировал случайное число, или если я в итоге запрашиваю документ isLessThanOrEqualTo.

РЕДАКТИРОВАТЬ -

Рабочий код:

let db = Firestore.firestore()
    var randomNumberOne: UInt64 = 0
    var plates = [Plate]()

func getRandomPlateOne() {
        let randomPlateRef = db.collection("plates")

            randomPlateRef.whereField("random", isGreaterThan: randomNumberOne).order(by: "random").limit(to: 1).getDocuments { (snap, error) in
                guard let documents = snap?.documents else {return}
                for document in documents {
                    let data = document.data()
                    let newPlate = Plate.init(data: data)
                    self.plates.append(newPlate)
                    print(self.plates)
                }

                if snap!.isEmpty {
                randomPlateRef.whereField("random", isLessThanOrEqualTo: self.randomNumberOne).order(by: "random", descending: true).limit(to: 1).getDocuments { (snap, error) in
                    guard let documents = snap?.documents else {return}
                    for document in documents {
                        let data = document.data()
                        let newPlate = Plate.init(data: data)
                        self.plates.append(newPlate)
                        print(self.plates)
                    }
                }
            }
        }
    }

func generateARandomNumber() {
        randomNumberOne = UInt64.random(in: 0 ... 9223372036854775807)
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...