在 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
我正在开发一个应用程序以在 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