2017-08-09 4 views
2

CLLocationManagerMKMapViewと同じUIViewControllerを使用しています。 重要な場所が変更された場合にのみ、APIを呼び出す必要があります。この中didUpdateLocationは、大規模なロケーション変更のためにviewWillAppearが呼び出されるたびに呼び出されます

import UIKit 
import CoreLocation 
import MapKit 


class ViewController: UIViewController,CLLocationManagerDelegate,MKMapViewDelegate { 

@IBOutlet weak var mapView: MKMapView! 

var locationManager = CLLocationManager() 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
    self.locationManager.requestAlwaysAuthorization() 
    self.locationManager.delegate = self 
    self.locationManager.startMonitoringSignificantLocationChanges() 
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation 
    self.locationManager.distanceFilter = 500 
    mapView.showsUserLocation = true 
} 

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(true) 
} 


override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

public func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 
     print("locations \(locations)") 
} 

} 

私はアプリの背景と前景が呼び出されるdidUpdateLocations作る時はいつでも、主な問題はあります。私はそれが呼び出されるのは、重要な場所の変更時にではなく、毎回ではなく、viewWillAppearが呼び出されます。

MKMapViewのためdidUpdateLocationsが見つかりました。

+0

は、なぜあなたは唯一の重要な位置情報の更新をしたい場合は、 'self.locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation'を持っているのですか?ユーザーの場所をマップビューに表示していますか? – Paulw11

+0

@ Paulw11 - はいMapViewでユーザーの場所を表示しています – Cintu

+0

これにより、マップからユーザーの場所の更新が要求され、これが代理人に配信されます。以前の場所の記録を保存し、場所の更新でその距離を確認することができます。距離がある閾値より大きい場合にのみサーバーを更新する – Paulw11

答えて

1

最後に保存した場所の距離を手動で確認できます。これを試して。

var lastLocation: CLLocation? 
public func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 

    if let lastLocation = lastLocation, let newLocation = locations.last { 
     if (lastLocation.distance(from: newLocation) < manager.distanceFilter) { 
      return 
     } 
    } 

    print("locations \(locations)") 
    lastLocation = locations.last 
} 
0

同じではありませんが、適切な処置を取る場合は、最後の場所を保存し、didUpdateLocations法の中身をチェックすることができます。

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

    let location : CLLocation = locations.last! 

    if location.coordinate.latitude != lastLat && location.coordinate.longitude != lastLon{ 
     // take action 
    } 
} 
関連する問題