Создавайте несколько снимков 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 и, таким образом, сбалансировать память с производительностью.

Другие вопросы по тегам