Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

GMSThreadException occur when displaying GMSMarkers on iOS Simulator

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?

like image 880
johnnyman Avatar asked May 13 '15 06:05

johnnyman


2 Answers

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
            }
        }
    }
}
like image 113
ztan Avatar answered Oct 27 '22 00:10

ztan


Swift 3.0

dispatch_async(dispatch_get_main_queue()) 

has been renamed to

DispatchQueue.main.async 
like image 25
nagam11 Avatar answered Oct 27 '22 00:10

nagam11