如何在swift / iOS中更新Google Maps标记位置

我想有多个标记并根据来自服务器的新数据更新它们的位置。 这是我如何在地图上显示标记(基本的东西):

func showMarkerOnMap() { mapView.clear() //<- That's GMSMapView for all in dataFromServer { let lat5 = all.latitude let lon5 = all.longitude let position = CLLocationCoordinate2DMake(lat5, lon5) let marker = GMSMarker(position: position) marker.flat = true marker.map = self.mapView } } 

这是我如何使用Alamofire获取dataFromServer:

 var dataFromServer = [dataClass]() func getCoordinatesFromServer(){ //Here goes headers and authentication data Alamofire.request(.GET, URL, headers: headers).authenticate(user: oranges, password: appels).responseJSON { response in switch response.result { case .Success: //Remove existing dataFromServer self.dataFromServer.removeAll() if let value = response.result.value { let json = JSON(value) for result in json.arrayValue { let lat = result["latitude"].doubleValue let lon = result["longitude"].doubleValue let zip = dataClass(latitude: lat, longitude: lon) //The next part is for checking that coordinates do not overlap if self.dataFromServer.count < 1 { self.dataFromServer.append(zip) } else { for all in self.dataFromServer { guard all.latitude != lat else { return } self.trblInfo1.append(zip) } } } //This should update existing markers? self.showMarkerOnMap() } case .Failure(let error): print(error) } } } 

基本上我只是将所有收到的数据附加到我dataFromServer属于dataClass类:

 class dataClass: NSObject { var latitude: Double var longitude: Double init(latitude: Double, longitude: Double) { self.latitude = latitude self.longitude = longitude } } 

我的getCoordinatesFromServer()函数每3秒钟被调用一次(现在)。 我期望得到新的坐标(我确实收到它们),然后showMarkerOnMap()从而清除所有现有的标记并创build新闻。 我得到的 – 标记重复和显着的滞后。 如果转到另一个视图,则原始标记消失,然后回滚到包含mapView的视图。

任何关于如何改善我的代码或其他select的build议?

如果您有任何来自服务器的职位的唯一标识符,您可以保留一个标记列表,然后在新数据到达时更新其位置。 像这样的东西:

 for result in json.arrayValue { let lat = result["latitude"].doubleValue let lon = result["longitude"].doubleValue let identifier = result["identifier"] as! String self.myMarkersDictionary[identifier]?.position.latitude = lat self.myMarkersDictionary[identifier]?.position.longitude = lon ... }