LocationManager调度队列问题

时间:2017-03-17 12:05:59

标签: ios swift core-location cllocationmanager

我所建立的:

我构建了一个简单的GMSMapView CLLocationManagerDelegate,只跟踪用户的当前位置并更新GMSMapView

问题:

CLLocationManagerDelegateGMSMapView屏幕)直接打开时,它可以正常工作,但当我尝试使用GMSMapView到达segue屏幕时,它会推动错误。

在主线程以外的线程上执行的调度队列上创建了位置管理器(0x145e5f9e0)。开发人员有责任确保在分配了位置管理器对象的线程上运行运行循环。特别是,不支持在任意调度队列(未附加到主队列)中创建位置管理器,这将导致无法接收回调。

3 个答案:

答案 0 :(得分:2)

使用 Swift 3 。所以问题在于变量GMSMapViewCLLocationManager的初始化。这就是它对我有用的方式:

我在ViewController类中定义了变量,如下所示

private var locationManager: CLLocationManager!
private var googleMapView: GMSMapView!

viewDidLoad()我引入了一个DispatchQueue来在主线程中运行它。

    DispatchQueue.main.async {
        //adding mapView
        self.googleMapView = GMSMapView()
        self.view.addSubview(self.googleMapView)
        self.googleMapView.translatesAutoresizingMaskIntoConstraints = false
        //auto layout constraints
        self.googleMapView.topAnchor.constraint(equalTo: self.view.topAnchor, constant: 0).isActive = true
        self.googleMapView.rightAnchor.constraint(equalTo: self.view.rightAnchor, constant: 0).isActive = true
        self.googleMapView.leftAnchor.constraint(equalTo: self.view.leftAnchor, constant: 0).isActive = true
        self.googleMapView.bottomAnchor.constraint(equalTo: self.view.bottomAnchor, constant: 0).isActive = true
        //location manager  setup
        self.locationManager = CLLocationManager()
        self.locationManager.delegate = self
        self.locationManager.startUpdatingHeading()
    }

答案 1 :(得分:1)

使用此代码

 DispatchQueue.main.async
{
  /*your code here*/
};

答案 2 :(得分:0)

您必须将用于查找位置的代码放入调度队列而不是主队列。