2009-07-23
ArrayCollection является источником множества событийСлучается, что разработчики сильно расстроены разговорчивостью коллекций вплоть до того, что используют вместо них просто Array. Событие CollectionChange рассылается при каждом изменении коллекции. Например, при удалении двух элементов и добавлении трех, разошлется как минимум 5 событий. А тогда, например, визуальные компоненты, напрямую реагирующие на изменения коллекций (они подписаны на CollectionChange), будут производить слишком много промежуточных действий, хотя их волнует только финальное состояние коллекции. Да и некоторых разработчиков откровенно пугает, что столько неприкаянных ненужных событий бродит по просторам родного и горячо любимого приложения. А оно тебе надо?Но перед тем, как с чем-то бороться, призываю все-таки задуматься. Нужно ли с этим бороться? Чем лично тебе мешает частая рассылка событий коллекции? Ведь если мешает чисто “просто так", то паранойя - это, вообще говоря, серьезное заболевание, которое можно лечить. Мне в голову приходит не так много ситуаций, когда эта проблема должна беспокоить. При адекватной разработке компоненты не реагируют на изменения коллекции молниеносно, обработка происходит в отложенном режиме. Сколько бы раз ни пришло событие, обработка произойдет только в commitProperties, например. Поэтому на работе стандартного RIA это особо не скажется. Однако бывают все-таки неприятные вещи. Например, происходит какая-то долгая обработка коллекции, которая занимает времени больше, чем кадр или несколько кадров, то приложение входит в фазу полного зависания. Изменения коллекции еще не завершились, а отрисовка уже запустилась и т.п. Если все-таки надо.Когда посещают мысли что-то с этим делать, то конечно, немедленно хочется воспользоваться методом disableAutoUpdate, который позволяет отменить рассылку событий. Вызвав этот метод, вы можете быть уверены, что никто не узнает об изменениях коллекции. Метод enableAutoUpdate включит рассылку событий обратно. Обратите внимание, что это приведет к рассылке всех событий, накопленных за время “молчания” коллекции. Казалось бы все просто. Но тут есть интересная особенность. В зависимости от того сколько раз вы вызвали disableAutoUpdate, столько раз и придется вызвать enableAutoUpdate, чтобы кто-нибудь все-таки узнал об изменениях. Это может быть неудобно, особенно, если учесть, что, например, DataGrid использует эти механизмы сам. Если вы хотите сами решать, когда сообщать об изменении коллекции, то можно унаследоваться от класса коллекции и переопределить метод enableAutoUpdate таким образом, чтобы рассылка никогда не возобновлялась. Однако это приведет к тому, что коллекция все равно будет сохранять данные о своих изменениях. Тут есть еще интересная особенность. Вызов метода refresh приводит к рассылке события CollectionChange вне зависимости от того, отключен автоапдейт или нет. Не знаю, баг это или фича, но этот же метод еще и обнуляет массив накопленных за “время молчания” изменений. Таким образом, переопределив метод enableAutoUpdate и вызывая refresh только тогда, когда сочтете нужным, вы решите проблему рассылки лишних событий и их накопления в коллекции. Трекбек адрес этой записиURL трекбека (щелкните правой кнопкой мыши и скопируйте ссылку) 2 комментариев Да, полезная вещь. Сам недавно узнал, хотел написать, но поленился Очень полезно в случаях, когда запрашиваешь данные и они приходят по кусочкам, но каждый кусочек сразу обрабатывается. У меня, например, запрашивался список файлов в директории и использование disable/enabledAutoUpdate() ускорило процесс раза в два.
2009-07-24 @ 16:08
Комментарий от: не суть [Посетитель]
==Ведь если мешает чисто “просто так", то паранойя - это, вообще говоря, серьезное заболевание, которое можно лечить.Не стоит судить так скоро. Лишние дерганья системы приводят к уменьшению производительности. Нынешние взгляды на ООП порождают огромный внутренний бесполезный функционал. Не думаете же вы, что осуществление рассылки сообщения бесплатно, даже если ни один из получателей на него не отреагирует? Мало кто из пользователей сегодняшних фреймворков и наборов компонент представляет себе, какая титаническая работа кипит внутри них, притом значительная часть этой работы тратится только на то, чтобы это все вообще работало, притом без какой-либо гарании, что "внутри" все произойдет как надо. Я делаю для себя вывод, что идеи ООП были творчески развиты и дошли-таки до абсурда. Повальное увлечение шаблонами программирования дошло до стадии, когда с их особенностями приходится специально бороться. О чем мы и читаем в данной статье... Я понимаю, что сегодня никто герцев и байтов не считает, но ничего хорошего в этом, по моему скромному мнению, нет.
2009-08-08 @ 21:24
Оставить комментарий |