- Приложение состоит из 4 основных компонентов: UI, Logic, Storage, Networking.
- Данные для отображения берутся с помощью NSFetchedResultsController, работающем с контекстом главной очереди. Любые обновления данных, которые произведет модуль логики, будут отображены в ui.
- Каждый модуль логики использует свой приватный managedObjectContext. Все контексты соединены непосредствено со стор координатором и синхронизуются по средствам нотификаций. Такой подход позволяет достичь более высокой производительности, чем при выстраивании иерархии контекстов.
- Валидация кеша проверяет, можно ли запрашиваемую область заполнить данными из предыдущих запросов с заданным возрастом. К примеру, если укрупнить масштаб, новой загрузки не будет. Или если с крупным масштабом посмотреть всю Москву, используя скролл, то при переходе к общему плану загрузки не произойдет, если у нас и так есть все данные. Это полезно тем, что на карте пользователь редко смотрит одинаковые регионы, но возможно он смотрит "стык" двух предыдущих и данные грузить не надо.
- Все параметры могут быть легко настроены через файл конфигурации: адрес api, срок жизни кеша, радиус обзора при запуске и тд
- Механизм валидации кеша имеет низкую масштабируемость. Можно предположить, что при интенсивном использовании он начнет подтормаживать (хоть и не на UI потоке, но время на принятие решения о загрузки увеличится). С этим можно бороться, сменив графический метод расчета на аналитический, с определением общей формы загруженных областей и проверкой вхождения текущей области.
- Модель точки не оптимальна с точки зрения поиска точек в sql. Координаты храняться в сериализованом виде, что не дает отфильтровать точки по географическому признаку еще в базе. Нужно уйти от сериализованного представления в виде бинарных данных к 2 числам долготы и широты.
- В случае, если мы загружаем регион, и в выгрузки нет какой-то точки, а в кеше она есть - точка удаляется. Однако при обновлении UI могут возникнуть проблемы, тк без данных (а они на тот момент уже удалены), может быть невозможно индифицировать точку. Этой проблемой я практически не занимался, тк протестировать это все равно мне не представляется возможным.