首页 > 解决方案 > 从大型 RealmCollection 中获取一小部分项目的最佳方法是什么?

问题描述

我目前正在使用 Realm 5.1.2 开发一个 Xamarin.Forms 项目。我需要收集一组 RealmObject,将它们过滤成一个较小的集合,然后将它们转换为 UI 元素,以便根据每个项目显示数据。在较小的数据集上,我的实现效果很好。但是,当尝试使用大型数据集(1,000,000 多个项目开始,过滤到 ~1000)时,应用程序在尝试转换过滤后的对象时会急剧变慢。

到目前为止,我已尝试通过将过滤过程包含到 IQueryables 和 IRealmCollection 来解决此问题。我知道在最终结果中实例化所有对象会导致速度变慢。我希望添加一个延迟加载方法,因为不是每个元素都一次可见(一次只加载 10 个,并根据需要请求更多)。我目前的实现是:

一次创建 RealmCollection:

var filteredRealmCollection = localRealm.All<Field>()
    .Where(field => field.IndexedId == input.TargetIndexId)  //Use indexed parameter for initial filter
    .Where(field => field.Value == input.TargetValue)  //Take all fields that match the requested filter value
    .AsRealmCollection();

根据需要呼吁新项目:

IEnumerable<FieldItemViewModel> GetFieldItemViewModels(int numberToSkip, int numberToTake)
{
    return filteredRealmCollection
        .Skip(numberToSkip)
        .Take(numberToTake)
        .Select(field => new FieldItemViewModel(field)
}

RealmCollection 的创建运行得很好,如果我等待整个列表实例化,它具有正确的值。调用 GetFieldItemViewModels 也可以正常工作。但是当我尝试实际使用返回的 IEnumerable 时,应用程序会冻结,直到它实例化整个 filtersRealmCollection。我还尝试使用 RealmCollection[index] 来获取项目的子集,结果相似。

有没有办法只实例化我使用 RealmCollection 请求的项目,以便我只加载 10 个项目而不是 ~1000 个?如果没有,是否有不同的方法来完成我在这里尝试做的事情?

标签: c#xamarinxamarin.formsrealm

解决方案


推荐阅读