Buffer de datos desde el cursor de la base de datos manteniendo la interfaz de usuario sensible
Tengo un catálogo de base de datos que se llena y un cursor que se puede usar para recuperar objetos. Este catálogo, obviamente, puede ser muy grande, y lo que me gustaría hacer es usarReactivoUI para almacenar los datos en búfer, mientras se mantiene la UI enlazada a los datos y receptiva. Seguí los pasosaquí para traducir miIEnumerable
en unaIObservable
, como se muestra aquí:
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;
});
}
}
}
En mi clase de vista (específicamente, laLoaded
evento), me suscribo a la fuente de datos y uso el método de búfer con la esperanza de mantener la interfaz de usuario receptiva.
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();
}
El resultado es, lamentablemente, todo lo contrario. Cuando mi vista controla (que contiene un simpleListBox
datos enlazados a laDbObjects
propiedad) se carga, no muestra ningún dato hasta que se haya enumerado todo el catálogo. Sólo entonces se actualiza la interfaz de usuario.
Soy nuevo en ReactiveUI, pero estoy seguro de que es capaz para la tarea en cuestión. ¿Alguien tiene alguna sugerencia o sugerencia si la estoy usando incorrectamente?