2

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

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

我相信如果需要超过 2 秒,用户看不到指示器真的很烦人。

解决方案:

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

1 回答 1

2

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

1.一次加载所有注解

Apple 在MKMapView 类参考中建议应立即加载所有注释(引脚):

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


2.重用你的注释视图

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


3.在后台线程上做重负载

如果您不能一次获取/加载注释,您可以使用Grand Central Dispatch让“重”方法在后台线程上运行,这样 UI 就不会阻塞。注意:从该方法(在 bg 线程上)对 UI 的任何更改都需要在主 UI 线程上显式发生。

关于背景,看看这个 Stackoverflow 答案

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")
    })
})

或者,将这个“异步”库用于一些语法糖。

于 2016-02-22T16:28:10.970 回答