Buffer de dados do cursor do banco de dados, mantendo a interface do usuário responsiva
Eu tenho um catálogo de banco de dados que é preenchido e um cursor que pode ser usado para recuperar objetos. Este catálogo pode obviamente ser muito grande, e o que eu gostaria de fazer é usarReactiveUI para armazenar em buffer os dados, mantendo a interface com os dados ligada e responsiva. Eu segui os passosAqui para traduzir meuIEnumerable
em umIObservable
, como mostrado aqui:
public class CatalogService
{
...
public IObservable<DbObject> DataSource
{
get
{
return Observable.Create<DbObject>(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;
});
}
}
}
Na minha opinião classe (especificamente, oLoaded
Estou subscrevendo a fonte de dados e usando o método buffer na esperança de manter a interface do usuário responsiva.
public ObservableCollection<DbObject> 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();
}
O resultado é, infelizmente, exatamente o oposto. Quando meu controle de visão (que contém um simplesListBox
dados ligados aoDbObjects
propriedade), ele não mostra nenhum dado até que todo o catálogo tenha sido enumerado. Só então a atualização da interface do usuário.
Eu sou novo no ReactiveUI, mas tenho certeza que é capaz para a tarefa em mãos. Alguém tem alguma sugestão ou ponteiros se eu estiver usando isso incorretamente?