Как я могу предварительно загрузить данные в UWP перед загрузкой страницы? Использование MVVM и Windows Template Studio - PullRequest
0 голосов
/ 15 апреля 2020

Какая лучшая практика для этого? Имейте в виду, что я использую шаблон MVVM и Windows Template studio. Поэтому, если есть какое-то встроенное решение / лучшая практика для загрузки данных, я был бы рад узнать об этом.

Я загружаю данные asyn c из API через http, что занимает пару секунд. Поэтому, когда пользователь нажимает на страницу, ему нужно немного подождать, пока данные не появятся. Я хочу, чтобы данные были предварительно загружены до того, как пользователь щелкнет страницу. Данные страницы должны быть загружены при запуске приложения.

Это мой код для загрузки данных на страницу прямо сейчас:

XAML

<i:Interaction.Behaviors>
    <ic:EventTriggerBehavior EventName="Loaded">
        <ic:InvokeCommandAction Command="{x:Bind ViewModel.LoadedCommand}" />
    </ic:EventTriggerBehavior>
</i:Interaction.Behaviors>

ViewModel:

public ICommand LoadedCommand => loadedCommand ?? (loadedCommand = new RelayCommand(LoadData));

private async void LoadData()
    {
        await LoadItemsAsync();
        await LoadImagesAsync();
    }

    private async Task LoadItemsAsync()
    {
        var items = await itemsDataAccess.GetAllAsync();

        foreach (Item i in items)
            ItemImageLinks.Add(new ItemImageLink() { Item = i });
    }

    private async Task LoadImagesAsync()
    {
        if (!InternetConnectionService.IsConnected())
            return;

        foreach (ItemImageLink iml in ItemImageLinks)
            iml.Image = await imagesDataAccess.GetImageAsync(iml.Item.ImageStringName);
    }

1 Ответ

0 голосов
/ 15 апреля 2020

Можно использовать комбинацию классов Lazy и Task.

Объявление поля:

private Lazy<Task<ItemImageLink[]>> ItemImageLinks;

Инициализация в конструкторе:

ItemImageLinks = new Lazy<Task<ItemImageLink[]>>(() => Task.Run(async () =>
{
    return await itemsDataAccess.GetAllAsync()
        .Select(item => new ItemImageLink() { Item = item })
        .ToArray();
}));

Предварительная загрузка в методе PreLoad:

await ItemImageLinks.Value;

Использование в любом месте необходимо:

foreach (ItemImageLink item in await ItemImageLinks.Value)
{
    // Do something with the item
}

Обновление: Оболочка Lazy необходима только в том случае, если необходимо выполнить предварительную загрузку в произвольный момент времени. Если вы всегда сразу загружаете конструктор, тогда достаточно простого Task<ItemImageLink[]>.

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