Pull to refresh

Comments 4

О, инфа на русском об этом чуде.

Примеры на гитхабе простые и понятные, но я не совсем понял пару моментов:
1. Как насчет производительности, когда из разных потоков поступают данные, а потом DD в один UI тред это публикует? В существующих реализациях я как разработчик сам вынужден об этом думать и обычно оптимизирую.
2. IReactiveList по моему был, который позволял делать многие похожие вещи, но у него был полезный метод Reset, когда я перефигачил в другом потоке кучу данных и дешевле было построить данные с нуля, чем каждое изменение пересылать. Как это сделать в DD? Интересует конкретно фильтрация — т.е. у меня есть источник, есть производная от источника основанная на IReactiveList. И вот мне надо сказать, что фильтр изменился (или изменились данные источника в другом потоке), для чего годился Reset.
Похоже, что нужная вам функциональность реализуется в DynamicData следующим образом:

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).
И все это реализуется несколькими экстеншн-методами.

Sign up to leave a comment.

Articles