Сбой памяти MKMapSnapshotter - множественные вызовы в UITableView

У нас есть приложение для iOS, которое имеет UITableView, содержащий снимки карты, которые создаются при появлении ячеек. Пример списка, который мы используем, просто показывает снимки карты, основанные на широте / длине, предоставленной в классе Model. Я начал замечать сбои памяти, поэтому я сократил код до минимума. Сбои все еще происходят, когда мы делаем только снимок, но ничего не делаем с результатами. Ниже приведен код, который содержится в нашей пользовательской ячейке и вызывается через cellForItemAtIndexPath метод:

private func testMapSnapshot(viewModel: StreamViewModel)
{
    let latDelta:CLLocationDegrees = 0.005
    let lonDelta:CLLocationDegrees = 0.005

    let span:MKCoordinateSpan = MKCoordinateSpanMake(latDelta, lonDelta)
    let location:CLLocationCoordinate2D = CLLocationCoordinate2DMake(viewModel.coordinate.latitude, viewModel.coordinate.longitude)
    let region:MKCoordinateRegion = MKCoordinateRegionMake(location, span)

    let options = MKMapSnapshotOptions()
    options.region = region
    options.size = mapImageView.frame.size
    options.scale = UIScreen.mainScreen().scale

    viewModel.mapSnapshotter = MKMapSnapshotter(options: options)
    viewModel.mapSnapshotter!.startWithCompletionHandler() { snapshot, error in
        // do nothing
    }
}

В didEndDisplayingCellЯ уверен, чтобы отменить mapSnapshotter. Смотрите для справки (мы сохраняем список моделей в нашем основном классе VC, который содержит табличное представление):

func collectionView(collectionView: UICollectionView, didEndDisplayingCell cell: UICollectionViewCell, forItemAtIndexPath indexPath: NSIndexPath) 
    let model = viewModel?[indexPath.item] {
        model.mapSnapshotter?.cancel()
        model.mapSnapshotter = nil
    }
}

Обратите внимание, что перед выполнением этого последнего шага, он был сбой гораздо раньше. Но теперь, если вы начнете быстро прокручивать список вниз, он начнет заикаться и не перестанет заикаться. Если вы переместитесь вверх и вниз по списку из примерно 150 строк, пройдет меньше 30 секунд, прежде чем мы начнем видеть предупреждения памяти и затем произойдет сбой.

Я проверил это через инструменты, но это не очень помогло. Похоже, что распределение кучи и анонимной виртуальной машины постепенно увеличивается, что может привести к сбою. Смотрите для справки:

Скриншот инструментов

Я видел этот пост там: MKMapSnapshotter использует невероятные объемы процессора и оперативной памяти, но он остается без ответа и на самом деле не решает, почему память не будет освобождена.

Любые мысли о том, где пойти на это? Заранее спасибо, и, пожалуйста, дайте мне знать, если я могу предоставить больше информации.

1 ответ

Решение

Хотя мне не удалось найти решение этой конкретной проблемы, я смог решить ее, вызвав моментальный снимок карты только тогда, когда scrollView останавливается - он затем захватывает все видимые ячейки и загружает только те из них. Таким образом, он минимизирует количество обращений к этому API и предотвращает проблемы с памятью, в отличие от того, что он постоянно вызывает его, когда вы прокручиваете список вниз через cellForRow метод.

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