Попытка использовать Дэн МакГрат, предложенный Решение для распознавания документов для запроса 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)
}
}
}
}