У меня есть каталог базы данных, который заполнен, и курсор, который можно использовать для извлечения объектов. Этот каталог, очевидно, может быть очень большим, и я хотел бы использовать ReactiveUI для буферизации данных, сохраняя при этом привязку данных и чувствительность к пользовательскому интерфейсу. Я последовал шаги here перевести мои IEnumerable
в IObservable
, как показано здесь:Буфер данных из курсора базы данных при сохранении пользовательского интерфейса
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;
});
}
}
}
В моем классе зрения (в частности, Loaded
события), я подписавшись на источник данных и с использованием метода буфера в надежды на отзывчивость пользовательского интерфейса.
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();
}
Результат, к сожалению, совсем наоборот. Когда мой контроль над просмотром (который содержит простой файл ListBox
, привязанный к свойству DbObjects
), он не показывает никаких данных до тех пор, пока весь каталог не будет перечислен. Только тогда обновляется пользовательский интерфейс.
Я новичок в ReactiveUI, но я уверен, что он способен на эту задачу. Есть ли у кого-нибудь предложения или указатели, если я неправильно их использую?
Вопросы: Как вы установили, что пользовательский интерфейс не просто дает результаты так быстро, что вы не можете их увидеть? Является ли пользовательский интерфейс фактически невосприимчивым? Какое время для первого результата и времени для последнего результата в запросе БД? Сколько строк в вашем результирующем наборе? –
Быстрый вопрос ... Какой объект здесь IEnumerable? –
@ Кристофер: ничего IEnumerable. Свойство DataSource было переведено из IEnumerable в IObservable. –
Charlie