В настоящее время мое приложение выполняет выборочную выборку данных, когда это требуется для отображения. Однако это приводит к некоторым задержкам и использованию мобильных данных, поэтому я хочу создать класс инициализатора, который выполняет однократную выборку данных при запуске приложения и использует его в течение всего жизненного цикла.
Однако, async
вызовы могут вернуть результат не по порядку и, возможно, позже, когда объект будет создан, что приведет к ошибке.
Я уже проверил async / await
и как их использовать для некоторого контроля потока выполнения, но я не совсем уверен, будет ли цикл for ждать завершения внутренних функций, прежде чем перейти к следующему элементу в списке.
Вот мой код (пока):
Future fetch() async {
myLinks = fetchDogList();
}
Future process() async {
for (int i = 0; i < myLinks.length; i++) {
await fetchInfo(myLinks[i]);
myDogs.add(new Dog(
name,
type,
age,
color,
gender,
description,
chip,
neutered,
humanBehaviour,
childBehaviour,
petBehaviour,
sledgeMaleBehaviour,
sledgeFemaleBehaviour,
otherDogBehaviour,
otherBehaviour,
jailBreak,
otherThings,
foreignAdoption,
imageLinks));
}
}
Future fetchInfo(String link) {
name = fetchDogInfo(link, labelFetchName);
type = fetchDogInfo(link, labelFetchBreed);
age = fetchDogInfo(link, labelFetchAge);
color = fetchDogInfo(link, labelFetchColor);
gender = fetchDogInfo(link, labelFetchGender);
description = fetchDogDetails(link, labelFetchDescription);
chip = fetchDogDetails(link, labelFetchChip);
neutered = fetchDogDetails(link, labelFetchNeutered);
humanBehaviour = fetchDogDetails(link, labelFetchHumanBehavior);
childBehaviour = fetchDogDetails(link, labelFetchChildBehavior);
petBehaviour = fetchDogDetails(link, labelFetchPetBehavior);
sledgeMaleBehaviour = fetchDogDetails(link, labelFetchSledgeMaleBehavior);
sledgeFemaleBehaviour =
fetchDogDetails(link, labelFetchSledgeFemaleBehavior);
otherDogBehaviour = fetchDogDetails(link, labelFetchOtherDogBehavior);
otherBehaviour = fetchDogDetails(link, labelFetchOtherDogBehavior);
jailBreak = fetchDogDetails(link, labelFetchJailbreak);
otherThings = fetchDogDetails(link, labelFetchOtherThings);
foreignAdoption = fetchDogDetails(link, labelFetchForeignAdoption);
imageLinks = fetchDogImageLinks(link);
}
Future main() async {
await fetch();
await process();
}
Если я все правильно понял, то при вызове метода main произойдет следующее:
- вызывается fetch (), и только после завершения
- вызывается process (), начинает перебирать ссылки
- fetchInfo () получает n-ю ссылку, а только после завершения
- myDogs.add создает новый объект Dog, затем
- fetchInfo () получает n + 1-ю ссылку
и так далее, пока не достигнет последней ссылки в myLinks
.
Является ли приведенное выше действительным, или я должен реализовать дополнительные меры безопасности?