Асинхронные и ожидающие задачи занимают слишком много времени - PullRequest
0 голосов
/ 24 июня 2019

Мне нужно вызвать все API и сохранить локальную базу данных перед входом в систему.Я использовал плагин sqflite. не может добавить фоновый запуск, поэтому я использовал await .

1-й запуск storeRegister () после завершения процесса, затем аналогичным образом выполняется storeEquipmentReg.

кнопка onPressed ():

await HelperDatabase1().storeRegister(_url, tokens);
await HelperDatabase1().storeEquipmentReg(_url, tokens);
await HelperDatabase1().storeGetUserPreference(_url, tokens);
await HelperDatabase1().storeDefRegisterCat(_url, tokens);
await HelperDatabase1().storeDefCatMaster(_url, tokens);
await HelperDatabase1().storeDefCatRelation(_url, tokens);
await HelperDatabase1().storeWoDescription(_url, tokens);
await HelperDatabase1().storeAssetAssembly(_url, tokens);
await HelperDatabase1().storeCategoryDefect(_url, tokens);
await HelperDatabase1().storeWorkSource(_url, tokens);
await HelperDatabase1().storeWorkTypes(_url, tokens);
await HelperDatabase1().storePriorities(_url, tokens);
await HelperDatabase1().storeSignIn(1);
await HelperSync().insert(_url, tokens);
await Helper().insert(token);
Navigator.pop(context);
Navigator.of(context).pushNamedAndRemoveUntil('/listView', (Route<dynamic> route) => false);

пример storeCategoryDefect метод: (все остальные коды такие же)

   storeCategoryDefect(String url, String token) async {
    var db = await db1;
    Batch batch = db.batch();
    final response = await http.get(
      '$url/nativeapi/v1.0/CategoryDefect',
      headers: {'Authorization': 'Bearer $token'},
    );
    final jsonResponse = json.decode(response.body);
    CategoryDefect model = CategoryDefect.fromJson(jsonResponse);
    int length = model.data.length;

    for (int i = 0; i < length; i++) {
      var data = DataCategoryDefect(
        i: model.data[i].i,
        d: model.data[i].d,
      );
      batch.insert(
        'CategoryDefectTable',
        data.toMap(),
      );
    }
    await batch.commit();
  }

1 Ответ

2 голосов
/ 24 июня 2019

Если вам не нужно выполнять их в определенном порядке, вы можете выполнить их одновременно, например:

await Future.wait([
  HelperDatabase1().storeRegister(_url, tokens),
  HelperDatabase1().storeEquipmentReg(_url, tokens),
  HelperDatabase1().storeGetUserPreference(_url, tokens),
  HelperDatabase1().storeDefRegisterCat(_url, tokens),
  HelperDatabase1().storeDefCatMaster(_url, tokens),
  HelperDatabase1().storeDefCatRelation(_url, tokens),
  HelperDatabase1().storeWoDescription(_url, tokens),
  HelperDatabase1().storeAssetAssembly(_url, tokens),
  HelperDatabase1().storeCategoryDefect(_url, tokens),
  HelperDatabase1().storeWorkSource(_url, tokens),
  HelperDatabase1().storeWorkTypes(_url, tokens),
  HelperDatabase1().storePriorities(_url, tokens),
  HelperDatabase1().storeSignIn(1),
  HelperSync().insert(_url, tokens),
  Helper().insert(token),
]);

Если вам нужно заказать их, вместо этого создайте пакет await Future.wait, как в вашем примере. Например, первые приоритеты внутри первого Future.wait, секунды после первого Future.wait bla bla ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...