I'm pretty new to this, but I've been managing to stumble my way through to getting the current location of my IOS device...etc The only problem is, I can't seem to get the GMSPlace to stay assigned to the property I declared at the top of my class, which I plan on using in another function.

It works fine when I run a print statement from within the scope of the callback, but when I seem to use the value stored in 'queryPlace', it returns a 'nil'. I'm guessing its a scope and lifetime issue, but I'm not sure if I understand it properly.

Here is the code that I'm having difficulty with understanding why it won't hold the value of 'place':

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'
  }

}

Thank you in advance for any help, very much appreciated.

1

There are 1 answers

1
Daniel Rinser On BEST ANSWER

No, there shouldn't be any "lifetime" issues. placeQuery is bound to the lifetime of your view controller instance.

Just a stupid guess (sorry if that was obvious): Are you sure that doSomethingWithPlace() accesses the variable after the callback has returned? Since you're setting it only in the asynchronous callback, the variable will not be set when loadCurrentPosition() returns.

If that's not the issue, here's a debugging tip to find out where this value is set back to nil: You can set a breakpoint at the line of the variable declaration and the debugger will break in the setter. If you're more into "print debugging", you can also add a didSet clause:

var placeQuery: GMSPlace? {
    didSet {
        print("setting placeQuery from \(oldValue) to \(placeQuery)")
    }
}