【发布时间】:2021-10-16 02:32:47
【问题描述】:
我的代码存在一些性能问题。我正在使用 Xamarin 表单项目中的基本 MVVM,当有人导航到另一个页面时,我想从 Internet 获取数据。以下是我所做的;
这就是我通过命令导航到另一个页面的方式; (老实说,我真的不知道这种导航方法是否有一些性能损失)
if (Application.Current.MainPage.Navigation.NavigationStack.Last().GetType() != typeof(SubcategoryPage))
{
await Application.Current.MainPage.Navigation.PushAsync(new SubcategoryPage());
}
在这里,我传递一个特定类别的 Id 以获取其对应的子类别
public SubcategoryPage(int id)
{
InitializeComponent();
this.BindingContext = new SubcategoryPageViewModel(id);
}
在SubcategoryPageViewModel的构造函数中,我是这样使用Id在线获取数据的;
public SubcategoryPageViewModel(int id)
{
SubcategoryLoader(id);
}
以下是通过我的 DataService 类从 Internet 获取数据的方法。下面的代码可以很好地从互联网上获取数据;
private async Task SubcategoryLoader(int id)
{
try
{
var subCategories = await SubcategoryDataService.GetSubcategories(id);
if (subCategories.code == 1) // StatusCode = Successful
{
SubCategories = subCategories.document;
}
else
{
await Application.Current.MainPage.DisplayAlert("Oops!","Something went wrong", "Ok");
}
}
catch (Exception ex)
{
await Application.Current.MainPage.DisplayAlert("Oops!", ex.Message, "Ok");
}
}
现在我的问题是 SubcategoryPage 直到在线服务结束才打开,这导致严重滞后。所以我想要发生的是在互联网服务发生之前打开 SubcategoryPage。
如有任何帮助,我们将不胜感激。
【问题讨论】:
-
使用页面的
OnAppearing事件异步加载数据 -
感谢您的快速回复。我已经这样做了,但是,想象一下我想导航到另一个页面,比如详细信息页面。如果我想从详细信息页面退出回到子类别页面,将触发 onappearing 事件,该事件将再次调用在线服务。我不希望这种情况发生。你还有什么办法吗?
-
使用简单的 bool 标志来防止请求运行多次
-
多么棒的建议。谢谢@Jason,我希望有另一种方法,因为我真的不想那样做。
-
在
OnAppearing中,可以检查列表是否为空,然后刷新。
标签: xamarin xamarin.forms mvvm xamarin.android xamarin.ios