c# - 我将通过 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 查询?
解决方案
推荐阅读
- javascript - 承诺中的承诺不按顺序使用每个
- prettier - 在更漂亮的情况下禁用 printWidth
- docker - 他们如何创建如此小的操作系统映像?
- angular - Angular 6 中的单例服务并发
- machine-learning - 使用机器学习进行模式识别
- c++ - 如何在 Qt 项目中指定 -W4 (Visual Studio)?
- django - 在 Django 视图中与线程共享会话
- android - 如何使用改造正确地制作可重用类来捕获响应数据?
- c++ - 如何在纳秒内制作 gprof 报告?
- ios - 我应该将底部工作表作为子视图添加到当前视图控制器还是推送一个添加了子视图的 UIWindow?