1

저는 매우 iOS에 익숙해 져 있으므로 나와 함께 해주십시오.값을 반환하는 동안 iOS에서 스레딩 문제가 발생했습니다.

class ViewController: UIViewController, CLLocationManagerDelegate { 

    var locationManager = CLLocationManager() 
    var lat: Double! = 0.0 
    var long: Double! = 0.0 

    override func viewDidLoad() { 
     super.viewDidLoad() 
      self.findMyLocation() 
      print(self.lat) 
      print(self.long) 
    } 

    func findMyLocation() { 
     self.locationManager = CLLocationManager() 
     locationManager.requestAlwaysAuthorization() 
     locationManager.delegate = self 
     locationManager.desiredAccuracy = kCLLocationAccuracyBest 
     locationManager.startMonitoringSignificantLocationChanges() 

     locationManager.delegate = self 
     locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters 
     locationManager.requestWhenInUseAuthorization() 

     // Here we start locating 
     locationManager.startUpdatingLocation() 
    } 

    func locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) { 
     for location in locations { 
      self.lat = location.coordinate.latitude 
      self.long = location.coordinate.longitude 
     } 
     locationManager.stopUpdatingLocation() 
    } 
} 

여기에 내 현재 위치의 위도와 경도를 얻을 수 및 지역 변수 latlong에 할당 내 간단한 뷰 컨트롤러의 다음 print 그것. 위 코드는 항상 latlong에 대해 0.0을 인쇄합니다. 그 이유는 먼저 print(lat) print(long)이 실행되고 그 이후에 위치 가져 오기가 실행되기 때문입니다. 이 문제를 해결할 수있는 쉬운 방법이 있지만 확실하지 않습니다. 어떤 도움을 주셔서 감사합니다. 나는 중대한 중앙 파견으로 일해야한다고 가정하고있다. 내가 뭘 봐야하는지 제안 해주세요.

또한 NSLocationWhenInUseUsageDescriptioninfo.plist에 추가했습니다.

답변

0

위치 관리자가 위치를 찾은 후에 만 ​​좌표를 인쇄 할 수 있습니다 (예 : locationManager(manager: CLLocationManager, didUpdateLocations locations: [CLLocation])).
그러나 위치 관리자에 아직 좌표가없는 경우 viewDidLoad으로 인쇄하십시오.

+0

예. 나는 그 부분을 안다. 내 질문에 위치를 얻고 viewDidLoad에서 인쇄 할 때까지 기다릴 수있는 방법이 있다면? – golldy

+0

아니요. 위치 관리자에서 좌표를 가져와야 인쇄 할 수 있습니다. –

+0

위치 관리자가 가져온 위치 좌표를 가져 오기위한 완료 핸들러가 마음에 들지 않습니까? – golldy

0

비동기 작업 방식에 익숙해 져야합니다. 그들은 미래의 어떤 시점에서 결과를 전달합니다.

CLLocation을 사용하면 사용자가 위치를 얻을 수있는 권한을 거부 할 가능성이 있습니다. 단지 당신이 그 위치를 원한다고해서 그것이 당신이 그것을 얻고 있다는 것을 의미하지는 않습니다.

따라서 위치는 아직 알려지지 않은 위치, 위치가 거부 된 위치 및 알려진 위치의 세 가지 경우 모두에서 유용한 것을 표시 할 수 있어야합니다. 그리고 상태가 "알 수 없음"에서 "액세스 거부"로 변경 될 경우를 대비하여 didChangeAuthorizationStatus도 구현하려고합니다. 그리고 각 콜백은 디스플레이를 적절하게 변경할 수 있어야합니다.