GMSThreadException occur when displaying GMSMarkers on iOS Simulator

偶尔善良 提交于 2019-12-10 13:40:00

问题


I'm developing an app to display about 200 GMSMarkers on GMSMapView I tried 2 methods to display the markers. Method1 is a bit slow but no error occur, however, Method2 runs smoothly on a real device but I got GMSThreadException when I test it on iOS Simulator

Here are the questions: 1. Is it ok to keep using method2? 2. If it is not ok to keep using method2, any good suggestions to reduce the loading time for the whole process?

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

Any help is appreciated Orz

UPDATE1

As @ztan answered below, I have to do all this in the main thread, is there any better solution than this?


回答1:


Google Maps iOA SDK requires that all drawing events be done on the main thread.

So, for your second method, you have to do put all your maker setup code inside the dispatch_get_main_queue() closure.

So your method 2 will be:

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



回答2:


Swift 3.0

dispatch_async(dispatch_get_main_queue()) 

has been renamed to

DispatchQueue.main.async 


来源:https://stackoverflow.com/questions/30206983/gmsthreadexception-occur-when-displaying-gmsmarkers-on-ios-simulator

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!