媒体提要 C# xamarin 的连续 return 个 Observablecollection
Continuous return of Observablecollection for a media feed C# xamarin
我目前正在使用 C# Xamarin 构建媒体源。
媒体提要是单个帖子的数据模型的可观察集合。
我正在使用的 API 相当有限,所以我无法正确查询以指定我想要的数据,这意味着我最终得到了很多数据。为确保用户实际获得足够的内容,我的集合需要请求 100 到 500 个元素。
这使得加载时间非常长,我希望生成 return 集合以在从 API.[=29= 检索数据的同时不断更新媒体提要]
Feed 管理员
public static async Task<ObservableCollection<PostPresenter>> GetFeed(ApiClient client, string account, int limit = 100)
{
var feed = new ObservableCollection<PostPresenter>();
var feedResult = await ApiClient.FeedClient.GetFeed(account, limit: limit);
if (feedResult != null)
{
foreach (var feedObj in feedResult.Result)
{
if (feedObj != null)
{
var comment = feedObj;
feed.Add(new PostPresenter()
{
Username = comment.Author,
Description = comment?.Title ?? comment.Body?.TruncateString(15) ?? "",
Media = comment.JsonMetadata.Image != null ? comment?.JsonMetadata?.Image.FirstOrDefault() : null,
Tags = comment?.JsonMetadata?.Tags.ToList() ?? new List<string> { "" },
PostTime = comment?.Created.ToString(),
Permlink = comment.Permlink,
EntryId = feedObj.Id
});
}
}
}
foreach (var testObj in feed)
{
await GetFeedMetadata(client, testObj);
}
return feed;
}
mainpage/feed 页面
var tempFeedEntries = await FeedManager.GetFeed(User.ApiClient, User.Username);
//var tempFeedEntries = await FeedManager.GetAllFeedData(User.ApiClient, Feed);
if (tempFeedEntries != null)
{
foreach(var tempFeedEntry in tempFeedEntries)
{
Feed.Add(tempFeedEntry);
IsLoading = false;
FeedListViewLoading.IsRunning = false;
FeedListViewLoading.IsRunning = false;
await FeedManager.GetAllFeedData(User.ApiClient, tempFeedEntries);
FeedListView.ItemsSource = Feed;
}
}
如何 return 集合或帖子的临时副本来填充提要,而无需等待每个元素都被加载?
您可以在这里做很多事情,但是您不能做的一件事是在 async
方法中使用 yield
。
我建议使用 TPL DataFlow,。基本上 Dataflow 允许您构建流水线处理器。
您可以创建一个工作,其中 return 其他工作的信息 return 其他工作的信息等等。
优点是,
它与 async
和 await
配合使用效果很好,这意味着您可以非常有效地并行执行此任务。
因为这些看似 IO 工作负载,它将有效地使用 IO 完成端口而不是线程池来非常有效地扩展它。
您可以设想设置最大并行度以允许在没有任何额外代码或开销的情况下将其分解 10 到 100 次(或更多),进而从您的在不占用线程的情况下同时提供(和元数据)。
您可以指定它以确保顺序,这意味着它将并行工作,并且return管道中下一个处理器的结果顺序。
你可以用一个动作块(无线程)结束它,它可以用 AddRange 更新你的 ObserverableCollection
(虽然我忘记了该方法是否会通知),你也需要编组使用 Invoke
.
回调到您的 ui 线程
即使有编组的缺点,DataFlow 也会通过几个因素以非常少的代码使它更高效、响应更快。
不幸的是,关于您的类型、API 和环境的信息不足,我无法将其组合在一起,即使是一个小示例。但是,我真诚地建议您通过学习曲线学习这个宝贵的 TPL 资源和库。
我目前正在使用 C# Xamarin 构建媒体源。
媒体提要是单个帖子的数据模型的可观察集合。
我正在使用的 API 相当有限,所以我无法正确查询以指定我想要的数据,这意味着我最终得到了很多数据。为确保用户实际获得足够的内容,我的集合需要请求 100 到 500 个元素。
这使得加载时间非常长,我希望生成 return 集合以在从 API.[=29= 检索数据的同时不断更新媒体提要]
Feed 管理员
public static async Task<ObservableCollection<PostPresenter>> GetFeed(ApiClient client, string account, int limit = 100)
{
var feed = new ObservableCollection<PostPresenter>();
var feedResult = await ApiClient.FeedClient.GetFeed(account, limit: limit);
if (feedResult != null)
{
foreach (var feedObj in feedResult.Result)
{
if (feedObj != null)
{
var comment = feedObj;
feed.Add(new PostPresenter()
{
Username = comment.Author,
Description = comment?.Title ?? comment.Body?.TruncateString(15) ?? "",
Media = comment.JsonMetadata.Image != null ? comment?.JsonMetadata?.Image.FirstOrDefault() : null,
Tags = comment?.JsonMetadata?.Tags.ToList() ?? new List<string> { "" },
PostTime = comment?.Created.ToString(),
Permlink = comment.Permlink,
EntryId = feedObj.Id
});
}
}
}
foreach (var testObj in feed)
{
await GetFeedMetadata(client, testObj);
}
return feed;
}
mainpage/feed 页面
var tempFeedEntries = await FeedManager.GetFeed(User.ApiClient, User.Username);
//var tempFeedEntries = await FeedManager.GetAllFeedData(User.ApiClient, Feed);
if (tempFeedEntries != null)
{
foreach(var tempFeedEntry in tempFeedEntries)
{
Feed.Add(tempFeedEntry);
IsLoading = false;
FeedListViewLoading.IsRunning = false;
FeedListViewLoading.IsRunning = false;
await FeedManager.GetAllFeedData(User.ApiClient, tempFeedEntries);
FeedListView.ItemsSource = Feed;
}
}
如何 return 集合或帖子的临时副本来填充提要,而无需等待每个元素都被加载?
您可以在这里做很多事情,但是您不能做的一件事是在 async
方法中使用 yield
。
我建议使用 TPL DataFlow,。基本上 Dataflow 允许您构建流水线处理器。
您可以创建一个工作,其中 return 其他工作的信息 return 其他工作的信息等等。
优点是,
它与
async
和await
配合使用效果很好,这意味着您可以非常有效地并行执行此任务。因为这些看似 IO 工作负载,它将有效地使用 IO 完成端口而不是线程池来非常有效地扩展它。
您可以设想设置最大并行度以允许在没有任何额外代码或开销的情况下将其分解 10 到 100 次(或更多),进而从您的在不占用线程的情况下同时提供(和元数据)。
您可以指定它以确保顺序,这意味着它将并行工作,并且return管道中下一个处理器的结果顺序。
你可以用一个动作块(无线程)结束它,它可以用 AddRange 更新你的
回调到您的 ui 线程ObserverableCollection
(虽然我忘记了该方法是否会通知),你也需要编组使用Invoke
.
即使有编组的缺点,DataFlow 也会通过几个因素以非常少的代码使它更高效、响应更快。
不幸的是,关于您的类型、API 和环境的信息不足,我无法将其组合在一起,即使是一个小示例。但是,我真诚地建议您通过学习曲线学习这个宝贵的 TPL 资源和库。