串行创建多个 MKMapView 快照
Create multiple MKMapView snapshots serially
我编写并使用 THIS CLASS 创建带有自定义注释的 MKMapView
的小快照图像,并将它们设置在 UITableViewCell
中的 UIImageView
中。我就是这样写的,调用即忘,不用太担心内存消耗。
工作原理:
我有一本字典,其中包含某个地方的相关值(名称、纬度、经度等)[来源是 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
磁盘缓存,而不是重做整个过程。
问题
创建地图,并将完成的图像设置到图像视图的过程绝对没问题。但是,当 table 中有超过 1 个单元格需要绘制这些不同的快照时,每个单元格都会创建一个新的 CellMapFactory
实例,这又会向应用程序 [= 添加一个新的 MKMapView
70=],对于请求的每个快照。这会疯狂地增加内存使用量。
期望的解决方案
我想CellMapFactory
连续创建这些快照。例如,如果我的 table 中的 20 个单元格需要 20 个唯一的快照,CellMapFactory
必须以串行方式处理它们(队列?),并使用相同的 MKMapView
一次创建一个快照.在我看来(也许我错了),这将有助于极大地限制内存消耗。
这是一个示例屏幕截图,仅供记录:
任何帮助(以及所需解决方案的变体)将不胜感激。谢谢。
如何创建一个快照接口,您的单元格可以使用它来请求快照。当快照不可用时,它为您提供了一种机制来安排快照创建并注册一个委托或完成块,它可以回调以接收创建的图像。
如果您在每个单元格中执行此操作,您可以提供一个占位符图像,该图像将在可用时更新为正确的图像。
在实现中,只需将请求排队,这样您就可以一次处理一个请求。当它们完成时,缓存并触发完成 delegate/block。不确定您可以 运行 在后台执行此任务多少?潜在地,您可以 运行 多个线程,让您控制使用多少 MKMapView,从而平衡内存与性能。
我编写并使用 THIS CLASS 创建带有自定义注释的 MKMapView
的小快照图像,并将它们设置在 UITableViewCell
中的 UIImageView
中。我就是这样写的,调用即忘,不用太担心内存消耗。
工作原理:
我有一本字典,其中包含某个地方的相关值(名称、纬度、经度等)[来源是 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
磁盘缓存,而不是重做整个过程。
问题
创建地图,并将完成的图像设置到图像视图的过程绝对没问题。但是,当 table 中有超过 1 个单元格需要绘制这些不同的快照时,每个单元格都会创建一个新的 CellMapFactory
实例,这又会向应用程序 [= 添加一个新的 MKMapView
70=],对于请求的每个快照。这会疯狂地增加内存使用量。
期望的解决方案
我想CellMapFactory
连续创建这些快照。例如,如果我的 table 中的 20 个单元格需要 20 个唯一的快照,CellMapFactory
必须以串行方式处理它们(队列?),并使用相同的 MKMapView
一次创建一个快照.在我看来(也许我错了),这将有助于极大地限制内存消耗。
这是一个示例屏幕截图,仅供记录:
任何帮助(以及所需解决方案的变体)将不胜感激。谢谢。
如何创建一个快照接口,您的单元格可以使用它来请求快照。当快照不可用时,它为您提供了一种机制来安排快照创建并注册一个委托或完成块,它可以回调以接收创建的图像。
如果您在每个单元格中执行此操作,您可以提供一个占位符图像,该图像将在可用时更新为正确的图像。
在实现中,只需将请求排队,这样您就可以一次处理一个请求。当它们完成时,缓存并触发完成 delegate/block。不确定您可以 运行 在后台执行此任务多少?潜在地,您可以 运行 多个线程,让您控制使用多少 MKMapView,从而平衡内存与性能。