Я делаю приложение на Swift, и у меня есть массив с числами, и я хочу получить некоторые данные в Firebase.
Проблема в том, что getDocuments скремблирует мою итерацию.
Когда я делаю тест с выводом на печать, первый выводит 0,1,2,3, но второй, находящийся внутри getDocuments, показывает 0,2,1,3
let test = ["20180905212533","20180905220014","20180905212533","20180905220014"]
for recepieID in 0 ... test.count-1{
print (recepieID) //Shows right recepieID = 0,1,2,3
db.collection("Recipes")
.whereField("created", isEqualTo: test[recepieID])
.getDocuments() { (querySnapshot, err) in
print (recepieID)// Do not show right recepieID = 0,2,1,3
}
}





почему вы используете -1, удалите это, возможно, он работает, тогда найдите: -
for recepieID in 0 ... test.count{
print (recepieID)
}
Эта операция является асинхронной, вы не можете гарантировать, что сервер ответит последовательно, либо используйте последовательную очередь.
let q = DispatchQueue(label: "CustomQueue")
let test = ["20180905212533","20180905220014","20180905212533","20180905220014"]
for recepieID in 0 ... test.count-1{
q.async {
print (recepieID) //Shows right recepieID = 0,1,2,3
db.collection("Recipes")
.whereField("created", isEqualTo: test[recepieID])
.getDocuments() { (querySnapshot, err) in
print (recepieID)// Do not show right recepieID = 0,2,1,3
}
}}
ИЛИ
load(0)
//
func load(_ recepieID:Int) {
db.collection("Recipes")
.whereField("created", isEqualTo: test[recepieID])
.getDocuments() { (querySnapshot, err) in
print (recepieID)// Do not show right recepieID = 0,2,1,3
if recepieID < test.count {
load(recepieID+1)
}
}
}
Я попробовал ваше решение и получил тот же результат. После прочтения проблемы кажется, что у меня все еще есть асинхронные обратные вызовы, хотя я должен синхронизироваться. Но мне нужно больше узнать об этой проблеме. Я не могу проверить ваше решение прямо сейчас, но вернусь к нему позже, после своего исследования.
Спасибо! Не знал, что могу принудительно поставить Firebase в последовательную очередь.