使用app异步更新地图上的注释

时间:2016-02-22 16:24:09

标签: ios swift annotations pins

我正在尝试在地图上更新注释时添加活动指示器。但似乎没有这样的方式。一旦更新过程开始,应用程序屏幕就会禁用并冻结,这就是为什么活动指示器可能不可见的原因。

我的问题是:是否可以与应用程序异步更新地图上的注释,因此活动指示器将可见。

我认为如果用户不超过2秒钟就不会看到指示器真的很烦人。

解决方案:

self.activityIndicator.startAnimating()
dispatch_after(DISPATCH_TIME_NOW, dispatch_get_main_queue(), {
                self.showPins(self.initialLat, locationLong: self.initialLong)
            })
self.activityIndicator.stopAnimating()

1 个答案:

答案 0 :(得分:2)

你必须确保你正在做这些事情:

1。一次加载所有注释

Apple建议在MKMapView Class Reference中立即加载所有注释(引脚):

  

配置地图界面时,应立即添加所有注释对象。地图视图使用每个注释对象中的坐标数据来确定何时需要在屏幕上显示相应的注释视图。 [...]因为只有在屏幕上才需要注释视图,所以MKMapView类提供了一种排队未使用注释视图的机制。具有重用标识符的注释视图可以在地图视图移动到屏幕外时由内部分离和排队。此功能通过一次仅在内存中保留少量注释视图并通过回收您拥有的视图来改善内存使用。它还通过减少在地图滚动时创建新视图的需要来提高滚动性能。


2。重用注释视图

您必须确保使用viewForAnnotation方法中的dequeueReusableAnnotationViewWithIdentifier正确重复使用现有注释视图。


3。在后台线程上进行大量加载

如果您无法立即获取/加载注释,则可以使用Grand Central Dispatch让“重量级”注释掉。方法在后台线程上运行,因此UI不会阻塞。注意:从该方法(在bg线程上)对UI的任何更改都需要在主UI线程上明确发生。

关于背景,请查看this Stackoverflow answer

let qualityOfServiceClass = QOS_CLASS_BACKGROUND
let backgroundQueue = dispatch_get_global_queue(qualityOfServiceClass, 0)
dispatch_async(backgroundQueue, {
    print("This is run on the background queue")

   dispatch_async(dispatch_get_main_queue(), { () -> Void in
        print("This is run on the main queue, after the previous code in outer block")
    })
})

或者,使用此' Async'一些语法糖库。