Swift: не может сохранить результирующее место placeClient.currentPlace как свойство класса для использования в другом месте

Я довольно новичок в этом, но мне удалось наткнуться на получение текущего местоположения моего устройства IOS... и т. Д. Единственная проблема в том, что я не могу заставить GMSPlace оставаться назначенным для свойство, которое я объявил в начале моего класса, которое я планирую использовать в другой функции.

Он отлично работает, когда я запускаю оператор print из контекста обратного вызова, но когда я, кажется, использую значение, сохраненное в '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'
  }

}

Заранее благодарю за любую помощь, очень ценю.

1 ответ

Решение

Нет, не должно быть никаких "пожизненных" проблем. placeQuery привязан к времени жизни вашего экземпляра контроллера представления.

Просто глупое предположение (извините, если это было очевидно): Вы уверены, что doSomethingWithPlace() обращается к переменной после возврата обратного вызова? Поскольку вы устанавливаете его только в асинхронном обратном вызове, переменная не будет установлена, когда loadCurrentPosition() возвращается.

Если это не проблема, вот совет отладки, чтобы узнать, где это значение установлено обратно nil: Вы можете установить точку останова в строке объявления переменной, и отладчик сломается в установщике. Если вам больше нравится "отладка печати", вы также можете добавить didSet пункт:

var placeQuery: GMSPlace? {
    didSet {
        print("setting placeQuery from \(oldValue) to \(placeQuery)")
    }
}
Другие вопросы по тегам