在 iOS 模拟器上显示 GMSMarkers 时发生 GMSThreadException

GMSThreadException occur when displaying GMSMarkers on iOS Simulator

我正在开发一个应用程序以在 GMSMapView 上显示大约 200 个 GMSMarkers 我尝试了 2 种方法来显示标记。方法 1 有点慢,但没有发生错误,然而,方法 2 在真实设备上运行顺利,但我在 iOS 模拟器

上测试时出现 GMSThreadException

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

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

更新 1

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

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

Swift 3.0

dispatch_async(dispatch_get_main_queue()) 

已重命名为

DispatchQueue.main.async