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)")
}
}