自定义CLLocationManager didUpdateLocations函数

时间:2017-12-30 15:10:53

标签: ios swift cllocationmanager

我看了Radar.iohttps://radar.io/documentation/sdk#ios )iOS SDK文档,我很好奇我如何创建自定义

locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation])功能。

class ViewController: UIViewController, RadarDelegate {

  override func viewDidLoad() {
      super.viewDidLoad()

      Radar.setDelegate(self)
  }
}

并且

Radar.trackOnce(completionHandler: { (status: RadarStatus, location: CLLocation?, events: [RadarEvent]?, user: RadarUser?) in
   // do something with status, location, events, user
})

来源:https://radar.io/documentation/sdk#ios

如何在这样的自定义类中获取位置更新和控制CLLocationManager?

 protocol MyRadarCloneDelegate {

 }

 class MyRadarClone {
   static func setDelegate(_ delegate:)  {

   }

   static func startTracking()  {

   }
   // some other function for control CLLocationManager
 }

3 个答案:

答案 0 :(得分:0)

如果我正确理解了您的问题,您希望从location访问自定义类Radar.trackOnce

你可以这样做。

以这种方式更新startTracking方法:

func startTracking(location: CLLocation)  {
    //do somtrhing with your location
    print(location)
}

在您的Radar.trackOnce方法中添加以下代码:

guard let userLocation = location else {return}
let myRadar = MyRadarClone()
myRadar.startTracking(location: userLocation)

希望这会有所帮助。

注意:代码未经过测试。

答案 1 :(得分:0)

不要为此

创建任何自定义协议或功能
  1. 创建NotificationCenter
  2. 从locationDidUpdate发布
  3. 观察您想要的地方
  4. 我认为这是一个好主意

答案 2 :(得分:0)

我假设目标是创建一个自定义生命周期方法,其作用类似viewDidLayoutSubviews,而不是locationManagerDidGetLocation,或者其他东西,只在您放置它的任何视图控制器中调用一次如果您只是想将位置管理器的委托扩展到其他视图控制器,那么策略是相同的(在最后进行小的调整):

class SomeViewController: UIViewController {

    func locationManagerDidGetLocation() {

        doSomethingThatRequiresUserLocation()

    }

}

CLLocationManagerDelegate有一个新位置数据的方法(一个用于新位置值)。只需发布通知:

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

    NotificationCenter.default.post(name: .locationManagerDidUpdateLocations, object: nil)

}

您还可以在静态结构变量或应用代理中共享应用中的位置值:

struct CurrentLocation {

    static var coordinate: CLLocationCoordinate2D?

}

并通过委托更新:

func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {

    // update shared property
    let lastLocation = locations.last!
    CurrentLocation.coordinate = lastLocation.coordinate

    // post app-wide notification
    NotificationCenter.default.post(name: .locationManagerDidUpdateLocations, object: nil)

}

要访问该值,只需在应用中的任意位置拨打CurrentLocation.coordinate即可。

然后只需向对象添加通知观察者,如UIViewController,即可收听该帖子:

class SomeViewController: UIViewController {

    func addNotificationObservers() {

        NotificationCenter.default.addObserver(self, selector: #selector(locationManagerDidUpdateLocationsHandler), name: .locationManagerDidUpdateLocations, object: nil)

    }

}

当第一篇文章到达时,删除观察者,因此只调用一次,然后调用自定义方法:

@objc func locationManagerDidUpdateLocationsHandler() {

    NotificationCenter.default.removeObserver(self, name: .locationManagerDidUpdateLocations, object: nil)

    locationManagerDidGetLocation()

}

现在它的工作方式类似于常规生命周期方法,只有在用户的位置可用时才会触发一次:

class SomeViewController: UIViewController {

    func locationManagerDidGetLocation() {

        doSomethingThatRequiresUserLocation()

    }

}

当然,您可以不删除观察者,并使其功能类似于位置管理器的扩展代理。如果这些视图控制器不能持续使用应用程序的生命,请不要忘记删除deinit中的所有观察者。