Notes |
|
|
Может не стоит вывешивать ITileStorageChangeble наружу, а просто подписываться на изменения в тайлохранилище, но перезапускать загрузку только если это обновление всего тайлохранилища, а не конкретного тайла - там есть способ их различать. |
|
|
(0013741)
|
zed
|
06-02-2014 13:16
|
|
> а просто подписываться на изменения в тайлохранилище
Ты про какой конкретно метод и где? |
|
|
|
у тайлохранилища есть нотифаер, который уведомляет о всех изменениях в том числе и о полном обновлении. |
|
|
(0013743)
|
zed
|
06-02-2014 13:45
|
|
Ты про INotifierTilePyramidUpdate? По крайней мере других нотифаеров там нету. И на что там подписываться, чтобы словить момент переключения типа хранилища с тайлового на Беркли (к примеру)? |
|
|
|
Да. Просто на AddListener и ловить событие с nil сообщением, а все остальные игнорировать. |
|
|
(0013745)
|
zed
|
06-02-2014 14:18
|
|
Во-первых, это очень неочевидный способ - поди-ка догадайся сходу, что нужно ловить nil у тайлового нотифаера. Т.е. это можно рассматривать как недокументированную возможность (причём, теоретическую - см. далее). А во-вторых, при смене хранилища не прилетает вообще никаких сообщений. Сообщения прилетают только при движении карты (какие-то ITileKey). |
|
|
(0013746)
|
zed
|
06-02-2014 14:25
|
|
И насколько я понял по исходникам, чтобы прилетел nil, должен дёргаться метод TileFullUpdateNotify, который никогда и никем на самом деле не дёргается. Плюс, есть косяк из-за которого может внезапно прилететь nil не там где надо. |
|
|
|
Мда. Похоже я это только планировал сделать. Ну тогда вперед. Возможно так действительно будет лучше. |
|
|
(0013748)
|
zed
|
06-02-2014 14:30
|
|
Ок, а что по поводу версии и url (aka DefUrlBase)? |
|
|
|
Ну там же есть конфиг. Добавь подписку на его изменения да и ладно. |
|
|
(0013750)
|
zed
|
06-02-2014 17:35
|
|
Подписался на изменения VersionConfig и качалка стала реагировать, а вот "отображалка" тупит. Видно как счётчик загруженных тайлов крутится и тайлы загружаются, но на экране изменения не отображаются...
Кстати, по этой же подписке прилетает и изменение типа хранилища. Короче, глючит со всех сторон :( |
|
|
|
Пожалуйста не трогай ничего связанного с версиями,а то мне сложно мержить будет то что я уже наковырял. |
|
|
|
>Видно как счётчик загруженных тайлов крутится и тайлы загружаются, но на экране изменения не отображаются...
Так и должно быть. Все дело именно в INotifierTilePyramidUpdate который при смене тайлохранилища не уведомляет ничего подписчикам потому что у нового создается новый экземпляр. Я вспомнил что это не доделал. Если сделаешь ITileStorageChangeble и в нужных местах поцепишь на него листенеры то эта проблема решиться.
>Кстати, по этой же подписке прилетает и изменение типа хранилища.
Это временно. После переделки версий и добавления в них хэшей перестанет. |
|
|
(0013757)
|
zed
|
08-02-2014 14:35
|
|
> Если сделаешь ITileStorageChangeble
Как его лучше делать? |
|
|
|
Если б я знал как лучше... |
|
|
|
В общем нужно решать, или делать прокси для INotifierTilePyramidUpdate и возвращать его из TTileStorageOfMapType. Или делать ITileStorageChangeble и при его изменении все заинтересованные должны будут переподписываться. У этого подхода есть преимущество - пропадает один захват примитива синхронизации при каждой операции с тайлохранилищем, но появляется риск, что старый экземпляр объекта-тайлохранилища будет жить пока не закончится фоновая операция, а для операций склейки/экспорта это может быть весьма долго.
Второй вариант мне нравится больше, так что скорее всего программе предстоит еще одна массовая правка. |
|
|
|
Кстати, TTileStorageOfMapType уже довольно давно уведомляет о полном изменении тайлохранилища и можно было бы на это подписываться. И как я понимаю нужно еще за настройками генерации урлов для карты следить. |
|