Комментарии 4
Примеры на гитхабе простые и понятные, но я не совсем понял пару моментов:
1. Как насчет производительности, когда из разных потоков поступают данные, а потом DD в один UI тред это публикует? В существующих реализациях я как разработчик сам вынужден об этом думать и обычно оптимизирую.
2. IReactiveList по моему был, который позволял делать многие похожие вещи, но у него был полезный метод Reset, когда я перефигачил в другом потоке кучу данных и дешевле было построить данные с нуля, чем каждое изменение пересылать. Как это сделать в DD? Интересует конкретно фильтрация — т.е. у меня есть источник, есть производная от источника основанная на IReactiveList. И вот мне надо сказать, что фильтр изменился (или изменились данные источника в другом потоке), для чего годился Reset.
observableCache.Edit(innerCache =>
{
innerCache.Clear();
innerCache.AddOrUpdate(myItems);
});
In order to increase efficiency when making multiple amendments, the cache provides a means of batch editing. This is achieved using the .Edit method which ensures only a single change notification is produced.IReactiveList и реализации были депрекейтнуты в пользу DynamicData в ReactiveUI 8.6.1, см. reactiveui.net/blog/2018/08/deprecated-reactive-list
Ещё есть вариант задать вопрос сообществу в Slack или Gitter.
Попробую как-нибудь DD с операцией Edit конечно, но выглядит не особо оптимально =)
Для SourceList
(аналог обыного List
) метода "убрать все и загрузить вот эти объекты", насколько я знаю, нет.
А вот для SourceCache
(странноватый аналог Dictionary
), если вызовите метод .Edit
, то можно получить доступ к методу Load
, который собственно перезаписывает коллекцию в одно действие, примерно так:
yourCache.Edit(context => context.Load(newValues));
Честно говоря, с доками у них плоховато, но что можно делать по Edit
с SourceCache
можно глянуть здесь, а по SourceList
— здесь.
При этом, насколько я помню, запись в одно действие все равно сгенерирует несколько уведомления в "наблюдаемом" по .Connect
объекте, что не всегда удобно. Т.е. ChangeSet
с несколькими изменениями.
P.S.: у SourceList
есть LoadFromSource
, но он принимает IObservable<IChangeSet<T>>
, что в общем случае может не подойти. Списком я редко пользуюсь, поэтому точно сказать затрудняюсь.
P.P.S: Вообще Edit
вещь хорошая, потому что, насколько я понял, адресует проблему многопоточности (ну или нет, и тогда весь мой код это потенциально один большой фейл). Разные потоки работают хорошо в приложениях с UI. Т.е. коллеция может обновляться как угодно, поверх Connect
можно применять например Sample
или Throttle
, которые, по опыту, могут переключаться на другой поток. И идея в том, чтобы максимально обработать данные на не-UI потоках, после чего в сам UI-поток выдать только необходимый для отображения минимум, вызвав перед Bind
, BindTo
, или ToPropertyEx
что-то вроде ObserveOn(UIDispatcher)
.
И все это реализуется несколькими экстеншн-методами.
DynamicData: Изменяющиеся коллекции, шаблон проектирования MVVM и реактивные расширения