以 xamarin 形式加载异步数据的正确方法

Cow*_*org 6 async-await xamarin.forms

异步加载数据以便能够尽快向用户显示 UI 的正确方法是什么。例如

我有一个 xamarin 表单项目,其中包含一个地图组件。我想在获取用户当前位置(来自 gps)和一些从服务器获取的位置/图钉之前显示地图。我见过这两种方法

1)从构造函数调用异步方法

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

2)在出现

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

两种方法似乎都“有效”,但我自欺欺人地从构造函数调用异步方法?

我还设法以两种方式设置 BindingContext 异步并正确绑定

有什么区别吗?

Nic*_*ers 10

调用加载数据的时间和时间有所不同。如果在页面中完成,ctor它将在第一次创建该页面时调用一次且仅一次。

如果在OnAppearing调用中完成,将在显示页面之前发生并且可以多次调用。例如,如果你将另一个页面推到它上面然后弹出它OnAppearing会被再次调用重新加载你的数据,如果另一个页面修改了上一页上显示的数据,这可能是可以的。否则,您可能会进行不必要的加载数据调用。

值得注意的是OnAppearingOnDisappearing并不总是在不同平台上同时调用。例如,如果您在 Android 或 iOS 上使用内置共享,一个可能会触发这两个事件,但另一个可能根本不会触发任何事件。

另外,我会确保您正在使用Task.Run();在后台线程上运行任何长时间运行的任务,以确保您没有锁定主线程,并可能设置一个 bool 来显示/隐藏微调器(如有必要)知道您的后台任务何时开始和结束。