-1

我编写并使用THIS CLASS创建MKMapView带有自定义注释的小快照图像,并将它们设置UIImageViewUITableViewCell. 我以这样的方式编写它,调用和忘记,而不用过多担心内存消耗。

这个怎么运作:

  • 我有一本包含地点相关值(名称、纬度、经度等)的字典 [来源是 FourSquare API]。

  • 然后我请求CellMapFactory(参见 Gist)为该位置创建一个图像,并将其设置在来自子类的图像视图中,UITableViewCell如下所示:

    CellMapFactory* cellMapFactory = [[CellMapFactory alloc] init];
    
    [cellMapFactory createCellMapForPlace:[self.cellData objectForKey:@"checkin"] inImageView:mapImageView];//mapImageView is a `UIImageView`.
    
  • 然后,CellMapFactory 使用MKMapSnapshotOptionsMKMapSnapshotter和自定义注释来创建此图像,并在成功完成后将其设置在引用的图像视图中。

  • 此外,在成功完成后,我使用 手动将图像缓存到磁盘SDWebImageManager,以便下次请求同一位置的屏幕截图时,将从SDWebImage磁盘缓存中获取它,而不是重做整个过程。

问题

地图创建的过程,以及将完成的图像设置到图像视图的过程是绝对没问题的。但是,当表格中超过 1 个单元格需要绘制这些不同的快照时,每个单元格都会为每个请求的快照创建一个新实例CellMapFactory,这反过来又会MKMapView在应用程序窗口中添加一个新实例。这疯狂地增加了内存使用量。

所需的解决方案

我想CellMapFactory连续创建这些快照。例如,如果我表中的 20 个单元格需要 20 个唯一快照,CellMapFactory则必须以串行方式(队列?)处理它们,并一次创建一个快照,使用相同的MKMapView. 我看到它的方式(也许我错了),这将有助于极大地限制内存消耗。

这是一个示例屏幕截图,仅供记录:

在此处输入图像描述

任何帮助(以及所需解决方案的变体)将不胜感激。谢谢。

4

1 回答 1

1

如何创建一个快照接口,您的单元可以使用它来请求快照。当快照不可用时,它为您提供了一种机制来安排快照创建并注册一个委托或完成块,它可以回调以接收创建的图像。

如果您在每个单元格中执行此操作,您可以提供一个占位符图像,该图像将在可用时更新为正确的图像。

在实现中,只需将请求排队,这样您就可以一次处理一个。当它们完成时,缓存并触发完成委托/块。不确定您可以在后台运行多少时间来执行此任务?潜在地,您可以运行多个线程,让您控制使用多少 MKMapView,从而平衡内存和性能。

于 2015-02-05T10:41:29.300 回答