2017-01-27 3 views
1

Если я создаю экземпляр CLLocationManager только в UIThread, событие LocationUpdated будет запущено. Почему это происходит? В документации Xamarin и Apple нет никакой информации о том, что CLLocationManager должен быть created на UIThread.Почему 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 и другие методы обновления. Информация о конструкторе отсутствует. Кроме того, я имел в виду документацию Xamarin, потому что моно может повлиять на CLLoationManager. – Alexander

Смежные вопросы