Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/97.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
iOS Swift-如何在返回信息窗口前等待请求结束(谷歌地图)_Ios_Google Maps_Swift3_Callback_Infowindow - Fatal编程技术网

iOS Swift-如何在返回信息窗口前等待请求结束(谷歌地图)

iOS Swift-如何在返回信息窗口前等待请求结束(谷歌地图),ios,google-maps,swift3,callback,infowindow,Ios,Google Maps,Swift3,Callback,Infowindow,我正在使用谷歌地图和自定义信息窗口 我有一个问题,我需要更新标签,但数据来自成功回调 这里的问题是,当数据可用时,我已经返回了我的信息窗口,我无法再更新它,因为它已经呈现(视图的快照) 我知道我有几个选择,例如: 通知 等待请求完成(阻止UI?) 安排我的任务 仅使用逻辑而不是LoadNibName的Init方法 我开始学习Swift 3 编辑:它正在使用睡眠(2)。但我不能每次需要显示信息窗口时都阻止UI 我找不到其他解决方案。请尝试以下方法: let infoWindow:CustomI

我正在使用谷歌地图和自定义信息窗口

我有一个问题,我需要更新标签,但数据来自成功回调

这里的问题是,当数据可用时,我已经返回了我的信息窗口,我无法再更新它,因为它已经呈现(视图的快照)

我知道我有几个选择,例如:

  • 通知
  • 等待请求完成(阻止UI?)
  • 安排我的任务
  • 仅使用逻辑而不是LoadNibName的Init方法
我开始学习Swift 3

编辑:它正在使用睡眠(2)。但我不能每次需要显示信息窗口时都阻止UI

我找不到其他解决方案。

请尝试以下方法:

let infoWindow:CustomInfoWindow? // declare out side of method
您现在的功能

func mapView(_ mapView: GMSMapView, markerInfoWindow marker: GMSMarker) -> UIView? {

     infoWindow = Bundle.main.loadNibNamed("CustomInfoWindow", owner: self, options: nil)?.first as! CustomInfoWindow

    let obs = marker.userData as! Observation

    ObsService.shared.getCityFromLatLong(lat: String(obs.coordinate.latitude), long: String(obs.coordinate.longitude)) { response in
       infoWindow.outletPlaceLabel.text = response
    }

    infoWindow.setDateAndTime(timestamp: obs.timestamp)

    return infoWindow
}

如果最初使用Interface builder设置了地图视图,则可以给它一个标记,然后使用相关标记搜索视图,在我编写注释的位置实例化新地图视图,并替换现有地图视图(从现有地图视图复制其框架)。地图视图还可能具有一个可调用的刷新功能。请参阅视图文档,了解如何搜索带有标记的视图(如果这是在教祖母吃蛋的话,那么很抱歉!)

在调用markerInfoWindow之前获取所有坐标的数据,并将值存储在阵列中,因此我必须向后端发出大量请求,以避免使用数据。如果只在需要时请求它(用户点击标记),不是更好吗?我不知道哪个线程getCityFromLatLong(lat:long:)从-check in the debugger中回调-但是您可能需要在对主线程的异步调用中包装“infoWindow.outletPlaceLabel.text=response”。e、 g.DispatchQueue.main.async{infoWindow.outletPlaceLabel.text=response}我已经尝试将其包装到DispatchQueue.main中。真正的问题是,通话结束时,信息窗口已经返回。当窗口呈现时,我不能修改它。嗨,Janna,如果我的答案对你有效,你能接受我的答案吗?这不会有任何区别,因为它在逻辑上与问题中的示例代码相同,因为对信息窗口的引用在这两种情况下都是指向同一对象的指针。顺便说一句,我会检查线程getCityFromLatLong(lat:long:),以防您需要包装在DispatchQueue.main.async{}中。这很好,但我不理解您的2条注释。我应该在哪里调用displayMapView?我需要显示信息窗口,这要感谢委托方法markerInfoWindow,它返回一个信息窗口。OK。函数“mapView(uMapView:GMSMapView,markerInfoWindow marker:GMSMarker)->UIView”是委托回调,还是您自己调用该函数?如果它是一个委托回调,那么我需要有更多的上下文来说明如何调用mapView(uquo:markerInfoWindow:)来帮助您。如果您自己调用该函数,可能您正在使用它返回的视图执行某些操作。这是GoogleMaps委托方法,在点击标记时(当mapView需要呈现信息窗口时)会调用该方法。请注意代码中的“我的注释”//但是您在此处触发了对google mapView的请求”必须添加用于首次触发其显示的代码。
func mapView(_ mapView: GMSMapView, markerInfoWindow marker: GMSMarker) -> UIView? {

     infoWindow = Bundle.main.loadNibNamed("CustomInfoWindow", owner: self, options: nil)?.first as! CustomInfoWindow

    let obs = marker.userData as! Observation

    ObsService.shared.getCityFromLatLong(lat: String(obs.coordinate.latitude), long: String(obs.coordinate.longitude)) { response in
       infoWindow.outletPlaceLabel.text = response
    }

    infoWindow.setDateAndTime(timestamp: obs.timestamp)

    return infoWindow
}
var cityName: String?

func mapView(_ mapView: GMSMapView, markerInfoWindow marker: GMSMarker) -> UIView? {
    if cityName == nil {
        let obs = marker.userData as! Observation
        ObsService.shared.getCityFromLatLong(lat: String(obs.coordinate.latitude), long: String(obs.coordinate.longitude) { response in
            self.cityName = response
            // Replace the existing map view with a new one here. Or call it's refresh function if it has one (I don't know, haven't used Google map view)
            return
        }
    }
    return self.mapViewHelper(mapView, markerInfoWindow: marker, city: cityName ?? "")
}

func mapViewHelper(_ mapView: GMSMapView, markerInfoWindow marker: GMSMarker, city: String?) -> UIView? {
    let infoWindow = Bundle.main.loadNibNamed("CustomInfoWindow", owner: self, options: nil)?.first as! CustomInfoWindow
    let obs = marker.userData as! Observation

    infoWindow.outletPlaceLabel.text = response
    infoWindow.setDateAndTime(timestamp: obs.timestamp)

    return infoWindow
}