How to get current longitude and latitude using CLLocationManager-Swift

后端 未结 6 514
囚心锁ツ
囚心锁ツ 2020-12-04 12:43

I want to get the current longitude and latitude of a location using Swift and display them via labels. I tried to do this but nothing displays on the labels.



        
6条回答
  •  Happy的楠姐
    2020-12-04 13:03

    Despite other advice you should use the CLLocationManagerDelegate to safely retrieve a location (without using it you may get null locations when the location manager doesn't have enough time to update). I strongly recommend wrapping the location manager code within a static shared helper (something along these lines):

    class Locator: NSObject, CLLocationManagerDelegate {
        enum Result  {
          case .Success(T)
          case .Failure(ErrorType)
        }
    
        static let shared: Locator = Locator()
    
        typealias Callback = (Result ) -> Void
    
        var requests: Array  = Array ()
    
        var location: CLLocation? { return sharedLocationManager.location  }
    
        lazy var sharedLocationManager: CLLocationManager = {
            let newLocationmanager = CLLocationManager()
            newLocationmanager.delegate = self
            // ...
            return newLocationmanager
        }()
    
        // MARK: - Authorization
    
        class func authorize() { shared.authorize() }
        func authorize() { sharedLocationManager.requestWhenInUseAuthorization() }
    
        // MARK: - Helpers
    
        func locate(callback: Callback) {
            self.requests.append(callback)
            sharedLocationManager.startUpdatingLocation()
        }
    
        func reset() {
            self.requests = Array ()
            sharedLocationManager.stopUpdatingLocation()
        }
    
        // MARK: - Delegate
    
        func locationManager(manager: CLLocationManager, didFailWithError error: NSError) {
            for request in self.requests { request(.Failure(error)) }
            self.reset()
        }
    
        func locationManager(manager: CLLocationManager, didUpdateLocations locations: Array ) {
            for request in self.requests { request(.Success(self)) }
            self.reset()
        }
    
    }
    

    Then in view did load (or anywhere else you need to get the current location) run:

    Locator.shared.locate { result in
      switch result {
      case .Success(locator):
        if let location = locator.location { /* ... */ }
      case .Failure(error):
        /* ... */
      }
    }
    

提交回复
热议问题