2017-01-27 6 views
1

UIThread에서만 CLLocationManager 인스턴스를 만들면 LocationUpdated 이벤트가 발생합니다. 왜 이런 일이 발생합니까? Xamarin 및 Apple 설명서에 CLLocationManager가 UIThread에서 created이어야한다는 단서가 없습니다.CLLocationManager가 처리 할 이벤트를 제공하지 않는 이유는 무엇입니까?

일부 코드는 locationManager.RequestWhenInUseAuthorization(); NSLocationWhenInUseUsageDescription은의 Info.plist

private void CreateLocationManagerWorkingOption() { 
    ExecuteOnMainThread (() => { 
     locationManager = new CLLocationManager(); 
    }); 
    locationManager.LocationsUpdated += (object sender, CLLocationsUpdatedEventArgs e) => { 
     OnLocationChanged (locationManager,e.Locations [e.Locations.Length - 1]); 
    }; 
} 

private void CreateLocationManagerNotWorkingOption() { 
    ExecuteOnSomeThread(()=> { 
     locationManager = new CLLocationManager(); 
    }); 
    locationManager.LocationsUpdated += (object sender, CLLocationsUpdatedEventArgs e) => { 
     OnLocationChanged (locationManager,e.Locations [e.Locations.Length - 1]); 
    }; 
} 

private void StartTrackingImpl() { 
    ExecuteOnMainThread (() => locationManager?.StartUpdatingLocation()); 
} 

답변

0

당신은 만들고 활성 실행 루프가있는 모든 스레드에서 처리 할 수에서 잘 살고있다. CLLocationManagerDelegate documentation에서

: 대리자 개체의 방법은 당신이 대응하는 위치 서비스를 시작하는 스레드에서 호출

. 이 스레드는 응용 프로그램의 주 스레드에서 발견되는 것과 같이 실행 루프가 있어야합니다.

+0

StartUpdatingLocation 및 기타 업데이트 방법에만 영향을줍니다. 생성자에 대한 정보는 없습니다. 게다가 모노는 CLLoationManager에 영향을 줄 수 있기 때문에 Xamarin 문서화를 의미했습니다. – Alexander