Сбой памяти 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
метод.