0

我对此很陌生,但我一直在设法通过获取我的 IOS 设备的当前位置...等唯一的问题是,我似乎无法让 GMSPlace 保持分配给我在班级顶部声明的属性,我计划在另一个函数中使用它。

当我在回调范围内运行打印语句时它工作正常,但是当我似乎使用存储在“queryPlace”中的值时,它返回一个“nil”。我猜这是一个范围和生命周期的问题,但我不确定我是否理解正确。

这是我难以理解为什么它不具有“位置”值的代码:

import UIKit
import CoreLocation
import GoogleMaps
import GooglePlaces


class GoogleMapSearchVC : UIViewController, CLLocationManagerDelegate {
 
  var placeQuery: GMSPlace?
  
  
  func loadCurrentPosition() {
        print("Loading Positions and Coords")

        // Invoke Callback method to get GMSPlacesLiklihood
        placesClient.currentPlace(callback: { (placeLikelihoodList, error) -> Void in
            
            
            if let error = error {
                print("Pick Place error: \(error.localizedDescription)")
                return
            }
            
            if let placeLikelihoodList = placeLikelihoodList {
                let place = placeLikelihoodList.likelihoods.first?.place
                if let place = place {
                    
                    self.updateMap(newLocation: place)
           // updateMap function moves camera to current location.
                    
                    self.placeQuery = place
           // If I print(self.placeQuery) here, it works fine, but later on placeQuery returns nil.
                }                
            }           
        })    
    }
    
  func doSomethingWithPlace() {
  
      print(self.placeQuery?coordinate.latitude)
      // Returns 'nil'
  }

}

提前感谢您的帮助,非常感谢。

4

1 回答 1

0

不,不应该有任何“终身”问题。placeQuery绑定到您的视图控制器实例的生命周期。

只是一个愚蠢的猜测(对不起,如果这很明显):您确定在回调返回doSomethingWithPlace()访问变量吗?由于您仅在异步回调中设置它,因此返回时不会设置该变量。loadCurrentPosition()

如果这不是问题,这里有一个调试提示,可以找出这个值被设置回的位置nil:您可以在变量声明的行设置一个断点,调试器将在 setter 中中断。如果您更喜欢“打印调试”,还可以添加一个didSet子句:

var placeQuery: GMSPlace? {
    didSet {
        print("setting placeQuery from \(oldValue) to \(placeQuery)")
    }
}
于 2018-08-24T08:52:27.043 回答