Создавайте несколько снимков MKMapView последовательно
Я написал и использую ЭТОТ КЛАСС для создания небольших снимков MKMapView
с пользовательской аннотацией, и установите их внутри UIImageView
в UITableViewCell
, Я написал это таким образом, чтобы вызывать и забывать, не слишком заботясь о потреблении памяти.
Как это устроено:
У меня есть словарь с соответствующими значениями места (название, широта, долгота и т. Д.) [Источник - FourSquare API].
Я тогда прошу
CellMapFactory
(см. Gist), чтобы создать изображение для местоположения и установить его в представлении изображения из подклассаUITableViewCell
как это:CellMapFactory* cellMapFactory = [[CellMapFactory alloc] init]; [cellMapFactory createCellMapForPlace:[self.cellData objectForKey:@"checkin"] inImageView:mapImageView];//mapImageView is a `UIImageView`.
CellMapFactory затем использует
MKMapSnapshotOptions
,MKMapSnapshotter
и пользовательскую аннотацию для создания этого изображения и установки его в представлении ссылочного изображения при успешном завершении.Также при успешном завершении я вручную кеширую образ на диск, используя
SDWebImageManager
, так что в следующий раз, когда запрашивается снимок экрана с тем же местоположением, он выбирается изSDWebImage
кеш диска, вместо того, чтобы переделывать весь процесс.
Эта проблема
Процесс создания карты и установки готового изображения в режим просмотра изображения абсолютно подходит. Однако, когда более чем одна ячейка в таблице должна построить эти разные снимки, каждая ячейка создает новый экземпляр CellMapFactory
, который, в свою очередь, добавляет новый MKMapView
в окне приложения, для каждого запрошенного снимка. Это безумно добавляет к использованию памяти.
Желаемое решение
мне бы хотелось CellMapFactory
создавать эти снимки поочередно. Например, если 20 ячеек в моей таблице нужно 20 уникальных снимков, CellMapFactory
должен обрабатывать их последовательно (очередь?) и создавать один снимок за раз, используя один и тот же MKMapView
, То, как я это вижу (возможно, я ошибаюсь), поможет значительно ограничить потребление памяти.
Вот пример экрана, только для записи:
Любая помощь (и варианты желаемого решения) будет принята с благодарностью. Благодарю.
1 ответ
Как насчет создания интерфейса снимка, который ваши ячейки могут использовать для запроса снимка. Когда моментальный снимок недоступен, он предоставляет механизм для планирования создания моментального снимка и регистрации делегата или блока завершения, к которому он может обратиться, чтобы получить созданное изображение.
Если вы сделаете это в каждой ячейке, вы можете предоставить изображение заполнителя, которое будет обновляться до нужного изображения по мере его появления.
В реализации просто поставьте в очередь запросы, которые должны позволять вам выполнять их по одному. Когда они завершатся, кэшируйте и запускайте делегат / блок завершения. Не уверен, сколько вы можете запустить в фоновом режиме для этой задачи? Потенциально вы можете запустить несколько потоков, которые позволят вам контролировать количество используемых MKMapView и, таким образом, сбалансировать память с производительностью.