调用GetDataFromServer方法的最佳位置在哪里?我的直觉和理由说它属于存储库,但我不知道在哪里调用它。我试图在构造函数中调用它,但效果不太好。它有一个异步方法的问题。
public class SQLiteRepository : ISQLiteRepository
{
private HttpClient _httpClient = new HttpClient();
private readonly SQLiteAsyncConnection _efContext;
public SQLiteRepository()
{
_efContext = DependencyService.Get<ISQLiteDb>().GetAsyncConnection();
_efContext.CreateTableAsync<EfPartner>();
}
public async Task<IEnumerable<EfPartner>> GetAllPartnersAsync()
{
try
{
var partners = await _efContext.Table<EfPartner>().ToListAsync();
return partners;
}
catch (Exception ex)
{
throw ex;
}
}
public async Task GetDataFromServerAsync()
{
try
{
var partners = await GetPartnersFromServerAsync();
var companies = await GetCompaniesFromServerAsync();
await _efContext.InsertAllAsync(partners);
}
catch (Exception ex)
{
throw ex;
}
}
private async Task<IEnumerable<EfPartner>> GetPartnersFromServerAsync()
{
try
{
var jsonObject = await _httpClient.GetStringAsync(Constants.PartnersUrl);
var dotNetObject = JsonConvert.DeserializeObject<List<EfPartner>>(jsonObject);
return new List<EfPartner>(dotNetObject);
}
catch (Exception ex)
{
throw ex;
}
}
private async Task<IEnumerable<EfCompany>> GetCompaniesFromServerAsync()
{
try
{
var jsonObject = await _httpClient.GetStringAsync(Constants.CompaniesUrl);
var dotNetObject = JsonConvert.DeserializeObject<List<EfCompany>>(jsonObject);
return new List<EfCompany>(dotNetObject);
}
catch (Exception ex)
{
throw ex;
}
}
}
我从 PartnersListPage.xaml.cs 调用了 GetDataFromServerAsync -> 感觉不对。
我很感激任何帮助。
谢谢你。
============================ 更新 ====================== ========
我正在开发的应用程序在 MasterDetailPage 中创建页面,如下所示:
private void MenuListView_ItemSelected(object sender, SelectedItemChangedEventArgs e)
{
if (e.SelectedItem == null)
return;
var menuItem = e.SelectedItem as EfMenuItem;
if (menuItem == null)
return;
var page = (Page)Activator.CreateInstance(menuItem.TargetPage);
page.Title = menuItem.Title;
Detail = new NavigationPage(page);
IsPresented = false;
MdpMasterPage.MenuListView.SelectedItem = null;
}
这是 PartnersListPage.xaml.cs,现在从哪里调用 GetDataFromServer:
public partial class PartnersListPage : ContentPage
{
private readonly SQLiteRepository _repo;
public PartnersListPage()
{
InitializeComponent();
_repo = new SQLiteRepository();
}
protected override async void OnAppearing()
{
await _repo.GetDataFromServerAsync();
var partners = await _repo.GetAllPartnersAsync();
InitializeGrid(partners);
base.OnAppearing();
}
这是一个与 MVVM 相关的重要主题,您正在做的是“正确的”,但是一旦您的应用程序变大,它可能会在以后出现问题,让我们想象一下这个场景:
用户是一个绝望的人,他/她想快速浏览你的应用程序,他/她打开这个特定页面 5 或 10 次,然后会发生什么?OnAppearing()
每次用户登陆此页面时都会调用您的方法,并会创建一个新线程,例如您的应用程序将开始在性能部分表现不佳。(特别是在 Android 上)。
所以我的建议是使用 MVVM 框架来处理基于模式的这些情况,这是一个使用 Prism 的小教程:
https://xamgirl.com/prism-in-xamarin-forms-step-by-step-part-1/
关于您的问题,您的 UIListView
特别是您的ItemSource
(如果您使用的是 ListView)属性应该绑定到您的GetAllPartnersAsync()
返回类型。
如果情况并非如此,并且基于上下文,我想InitializeGrid(partners);
是在您的 XAML 类中为网格创建单元格,因此我想您可以在正确创建 UI 的情况下逐步调试。网格没有 ItemSource 属性
如果你想要一个带有 ItemSource 属性的网格,我建议你起诉这个:
https://github.com/Manne990/XamTest
https://github.com/daniel-luberda/DLToolkit.Forms.Controls/tree/master/FlowListView
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句