首页 > 解决方案 > 我将通过 API 将数据加载到我的 ListView 异步

问题描述

我将通过 API 将数据加载到我的 ListView 异步中。

我有一个项目列表(1 到 6300),在我的搜索框中我可以搜索这些项目,然后它将显示在 ListView 中。

现在我想显示来自 JSON Api 的项目平均价格。

如果你想看看这个工具,这里是 git 链接:https ://github.com/Triky313/AlbionOnline-StatisticsAnalysis

我目前的方法看起来像这样。一旦从 API 加载新数据,然后仅在它们超过一小时时再次加载。

    public static ObservableCollection<MarketStatChartItem> MarketStatChartItemList = new ObservableCollection<MarketStatChartItem>();

    public static async Task<string> GetMarketStatAvgPriceAsync(string uniqueName, Location location)
    {
        try
        {
            using (var wc = new WebClient())
            {
                var apiString = "https://www.albion-online-data.com/api/v1/stats/charts/" +
                                $"{FormattingUniqueNameForApi(uniqueName)}?date={DateTime.Now:MM-dd-yyyy}";

                var itemCheck = MarketStatChartItemList?.FirstOrDefault(i => i.UniqueName == uniqueName);

                if (itemCheck == null)
                {
                    var itemString = await wc.DownloadStringTaskAsync(apiString);
                    var values = JsonConvert.DeserializeObject<List<MarketStatChartResponse>>(itemString);

                    var newItem = new MarketStatChartItem()
                    {
                        UniqueName = uniqueName,
                        MarketStatChartResponse = values,
                        LastUpdate = DateTime.Now
                    };

                    MarketStatChartItemList?.Add(newItem);

                    var data = newItem.MarketStatChartResponse
                        .FirstOrDefault(itm => itm.Location == Locations.GetName(location))?.Data;
                    var findIndex = data?.TimeStamps?.FindIndex(t => t == data.TimeStamps.Max());

                    if (findIndex != null)
                        return data.PricesAvg[(int) findIndex].ToString("N", LanguageController.DefaultCultureInfo);
                    return "-";
                }

                if (itemCheck.LastUpdate <= DateTime.Now.AddHours(-1))
                {
                    var itemString = await wc.DownloadStringTaskAsync(apiString);
                    var values = JsonConvert.DeserializeObject<List<MarketStatChartResponse>>(itemString);

                    itemCheck.LastUpdate = DateTime.Now;
                    itemCheck.MarketStatChartResponse = values;
                }

                var itemCheckData = itemCheck.MarketStatChartResponse
                    .FirstOrDefault(itm => itm.Location == Locations.GetName(location))?.Data;
                var itemCheckFindIndex =
                    itemCheckData?.TimeStamps?.FindIndex(t => t == itemCheckData.TimeStamps.Max());

                if (itemCheckFindIndex != null)
                    return itemCheckData.PricesAvg[(int) itemCheckFindIndex]
                        .ToString("N", LanguageController.DefaultCultureInfo);
                return "-";
            }
        }
        catch (Exception ex)
        {
            Debug.Print(ex.StackTrace);
            Debug.Print(ex.Message);
            return "-";
        }
    }

通过 API 请求,一切都加载了很长时间,我无法正常使用搜索。

有谁知道在没有搜索问题的情况下加载异步数据的更好解决方案?

编辑:这里再次在视觉上表示...... 在此处输入图像描述

项目列表已经加载,搜索速度非常快。

现在您可以在右侧看到一些缺点,应该有数字。这些数字稍后会在项目显示在列表中时加载。

问题:如果他在搜索中有 50 多个项目,然后用 API 的数据填充它们,则搜索非常陈旧。

对于每个项目,都会发出一个 API 请求。

如果搜索更改或是否有其他可能性,是否可以取消此 API 查询?

标签: c#.netwpfapilistview

解决方案


推荐阅读