Буферизуйте данные из курсора базы данных, оставив интерфейс отзывчивым
У меня есть каталог базы данных, который заполнен, и курсор, который можно использовать для извлечения объектов. Этот каталог, очевидно, может быть очень большим, и что яя хотел бы сделать, это использоватьReactiveUI буферизировать данные, сохраняя привязанность данных интерфейса и отзывчивость. Я следовал за шагамиВот перевести мойIEnumerable
вIObservable
, как показано здесь:
public class CatalogService
{
...
public IObservable DataSource
{
get
{
return Observable.Create(obs =>
{
var cursor = Database.Instance.GetAllObjects();
var status = cursor.MoveToFirst();
while (status == DbStatus.OK)
{
var dbObject= Db.Create(cursor);
obs.OnNext(dbObject);
status = cursor.MoveToNext();
}
obs.OnCompleted();
return Disposable.Empty;
});
}
}
}
На мой взгляд, класс (в частности,Loaded
событие), я подписываюсь на источник данных и использую метод буфера в надежде сохранить отзывчивость пользовательского интерфейса.
public ObservableCollection DbObjects { get; set; }
private async void OnLoad(object sender, RoutedEventArgs e)
{
var observableData = CatalogService.Instance.DataSource.Publish();
var chunked = observableData.Buffer(TimeSpan.FromMilliseconds(100));
var dispatcherObs = chunked.ObserveOnDispatcher(DispatcherPriority.Background);
dispatcherObs.Subscribe(dbObjects =>
{
foreach (var dbObject in dbObjects)
{
DbObjects.Add(dbObject);
}
});
await Task.Run(() => observableData.Connect());
await dispatcherObs.ToTask();
}
Результат, к сожалению, совершенно противоположный. Когда мой контроль зрения (который содержит простойListBox
привязанный к даннымDbObjects
свойство) загружает, не показывает никаких данных, пока не будет перечислен весь каталог. Только тогда пользовательский интерфейс обновляется.
Я новичок в ReactiveUI, но я уверен, что он способен на выполнение поставленной задачи. У кого-нибудь есть какие-либо предложения или указатели, если я использую это неправильно?