правильный способ загрузки данных асинхронно в формах xamarin - PullRequest
0 голосов
/ 24 сентября 2018

Как правильно загрузить асинхронные данные, чтобы пользователь мог максимально быстро показывать пользовательский интерфейс. Например,

У меня есть проект xamarin forms projekt, содержащий компонент карты,Я хочу показать карту, прежде чем я получу текущее местоположение пользователей (из GPS) и некоторые местоположения / булавки, которые выбираются с сервера.Я видел эти два подхода

1) Из конструктора вызвать асинхронный метод

   Map mMyMap;
   ctor()
   {
       InitializeCompeont();
       InitAsync();
   }
   private async void InitAsync()
   { 
      var pins = await GetPinsFromServer();
      mMyMap.Pins.Add(pins)
   }

2) в При появлении

 ctor()
  {
   InitalizeComponent()
  }
  protected override async void OnAppearing()
  { 
      var pins = await GetPinsFromServer();
       mMyMap.Pins.Add(pins)
   }

Кажется, что оба подхода "работают", но я обманываю себя, вызывая асинхронный метод из конструктора?

Мне также удалось установить асинхронность BindingContext в обоих направлениях, и она правильно связывается

Есть ли разница?

1 Ответ

0 голосов
/ 24 сентября 2018

Существует разница во времени и при вызове данных загрузки.Если это сделано на странице ctor, она будет вызываться один раз и только один раз при первом создании этой страницы.

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

Стоит отметить, что OnAppearing и OnDisappearing не всегда последовательно вызываются одновременно на разных платформах.Например, если вы использовали встроенный общий доступ на Android или iOS, одно может запускать оба события, а другое может вообще не запускать.

Кроме того, я хотел бы убедиться, что вы используетеTask.Run(); для запуска любых длительных задач в фоновом потоке, чтобы гарантировать, что вы не блокируете основной поток, и, возможно, в настройках bool показывать / скрывать счетчик, если необходимо знать, когда ваша фоновая задача запускается и заканчивается.

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