在iOS模拟器

时间:2015-05-13 06:12:42

标签: ios google-maps swift google-maps-markers

我正在开发一个应用程序,在GMSMapView上显示大约200个GMSMarkers 我尝试了2种方法来显示标记。 Method1有点慢,但没有发生错误,但是,Method2在真实设备上运行顺畅,但是当我在iOS模拟器上测试时,我得到了GMSThreadException

以下是问题:  1.继续使用method2可以吗?  2.如果不能继续使用method2,那么减少整个过程的加载时间有什么好的建议吗?

func Method1() {
    for location in locationsArrayFromSomeWhere {
        let placeMarker = PlaceMarker(coordinate: location.coordinate)
        .
        .//Simple Setup
        .
        placeMarker.map = self.mapView
    }
}

func Method2() {
    dispatch_async(dispatch_get_global_queue(Int(QOS_CLASS_USER_INITIATED.value), 0)) {
        for location in locationsArrayFromSomeWhere {
            let placeMarker = PlaceMarker(coordinate: location.coordinate)
            .
            .//Simple Setup
            .
            dispatch_async(dispatch_get_main_queue()) {
                placeMarker.map = self.mapView
            }
        }
    }
}
enter code here

Orz赞赏任何帮助

UPDATE1

正如@ztan在下面回答的那样,我必须在主线程中完成所有这些,有没有比这更好的解决方案?

2 个答案:

答案 0 :(得分:6)

Google Maps iOA SDK要求所有绘图事件都在主线程上完成。

因此,对于第二种方法,您必须将所有制造商设置代码放在dispatch_get_main_queue()闭包中。

所以你的方法2将是:

func Method2() {
    dispatch_async(dispatch_get_global_queue(Int(QOS_CLASS_USER_INITIATED.value), 0)) {
        for location in locationsArrayFromSomeWhere {

            dispatch_async(dispatch_get_main_queue()) {
                let placeMarker = PlaceMarker(coordinate: location.coordinate)
                .
                .//Simple Setup
                .
                placeMarker.map = self.mapView
            }
        }
    }
}

答案 1 :(得分:2)

Swift 3.0

dispatch_async(dispatch_get_main_queue()) 

已重命名为

DispatchQueue.main.async