【问题标题】:Where should I instantiate a location manager if my app uses it throughout its various view controllers?如果我的应用在其各种视图控制器中使用位置管理器,我应该在哪里实例化它?
【发布时间】:2017-04-16 17:05:10
【问题描述】:

我有一个应用程序在其各种视图控制器中使用用户的位置,我了解到,为了获得该位置,您需要创建一个 CLLocationManger 实例并符合 CLLocationManagerDelegate 协议。

是否可以创建一个 CLLocationManager 实例并在我的不同视图控制器中使用它的属性,例如坐标,或者我应该在每个视图控制器类中创建一个 CLLocationManager?

【问题讨论】:

  • 是否可以在一种常量文件中创建它?
  • 你已经尝试了什么?是的,可以并鼓励使用 CLLocationManager 的单个实例。委托可以是一个共享对象,其他客户端可以通过它对其属性进行 KVO,也可以发送 NSNotifications(不太理想)
  • @dbn 我正在考虑在应用程序委托的 didloadwithoptions 函数中实例化它,并尝试从其他视图控制器引用该实例,但它不起作用。所以我来这里寻找答案。我只需要在其他视图控制器中使用的纬度和经度。

标签: ios swift xcode geolocation cllocationmanager


【解决方案1】:

一个快速且有点健壮的 hack 可能是:

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate, CLLocationManagerDelegate {

    func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {
        locationManager = CLLocationManager()
        locationManager.delegate = self
        locationManager.startUpdatingLocation()
        return true
     }

    func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
        lastLocation = locations.last!
    }

在同一个源文件中,在全局范围内,添加:

private var lastLocation: CLLocation? {
    didSet { 
        locationCallback?(lastLocation!)
        locationCallback = nil
    }
}

private var locationCallback: ((CLLocation) -> Void)?

func getLastLocation(callback: (CLLocationManager) -> Void) {
    guard let location = lastLocation else {
        locationCallback = callback
        return
     }
     locationCallback(location)
}

最后,在您的应用程序的其他地方,您可以使用以下方法获取您的最后个已知位置:

getLastLocation { location in
    print(location)
}

【讨论】:

  • 非常感谢!这会比创建一个单例/静态类并在那里做同样的事情更好吗?
  • @PaulJohn 我会说是的,和单身一样!但是,如果您的应用程序变得庞大,具有各种基于位置的功能,那么将此代码重构为专用类是前进的方向;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-26
  • 1970-01-01
  • 2017-02-13
  • 1970-01-01
相关资源
最近更新 更多