NSUserDefaults - Xamarin
Я просто пытаюсь спасти/восстановить пару парных. То, что я вижу, это то, что он работает при подключении к отладчику, но после 15 минут закрытия приложения - перезапустите приложение, и он восстановит "-180" для обоих пар.
Правильно ли это выглядит? Или вы думаете, что я как-то экономлю "-180"?
Это не устройство, а симулятор. Я использую Map.DidUpdateUserLocation
, который дает MKUserLocationEventArgs
.
Как-то он дает -180, -180 для позиции. Возможная ошибка Xamarin?
private CLLocationCoordinate2D GetLastLocation()
{
var user = NSUserDefaults.StandardUserDefaults;
double lat = user.DoubleForKey ("LastPositionLat");
double lng = user.DoubleForKey ("LastPositionLng");
var location = new CLLocationCoordinate2D (lat, lng);
return location;
}
private void SaveLastLocation(CLLocationCoordinate2D coord)
{
var user = NSUserDefaults.StandardUserDefaults;
user.SetDouble (coord.Latitude, "LastPositionLat");
user.SetDouble (coord.Longitude, "LastPositionLng");
user.Synchronize ();
}
Ответы
Ответ 1
Этот вопрос довольно старый, но он подскочил на меня по одной причине, мы видели очень странное поведение, сохраняющее NSUserDefaults.StandardUserdefaults в локальной переменной, а затем неоднократно обращающееся к ней.
Что-то в привязке Xamarin.iOS(по крайней мере, для MonoTouch, то есть не унифицированного API) там довольно сложно, вероятно, проблема с GC, когда объект теряет свой собственный одноранговый узел. У нас есть это в нашей кодовой базе:
// it appears that capturing an instance of NSUserDefaults.StandardUserdefaults in a variable does not work in every case
// we have observed a voodoo bug when reading a written value from such an instance would fail (as I said, voodoo!)
// thus, we directly access standard user defaults here always via the lambda
Ответ 2
-180 определенно кажется подозрительным, поскольку он не равен 0 или MAX двойным и, по-видимому, связан с координатами. Возможно, вы захватываете местоположение пользователя, прежде чем менеджер местоположения успеет их найти. Вы можете проверить, что чтение указателя местоположения дает вам не старше ~ 15 секунд. Он обычно дает вам последнюю блокировку местоположения, пока она становится последней. -180 может быть тем, что симулятор дает вам "последнее известное местоположение".
Я не знаю monotouch, но похоже, что вы вызываете правильные методы.
Ответ 3
Возможно, вы можете использовать настройки nuget для обработки (PCL), которые вы можете найти в github здесь или установить через nuget здесь
Я использовал эту библиотеку во многих проектах в прошлом и никогда не представляю мне никаких странных значений. Обратите внимание, что если вы видите "-180", снова и снова, это означает, что что-то, где-то в вашем коде, записывает это значение.
Ответ 4
Я узнаю, что идентификатор приложения в симуляторе будет изменен после того, как вы перезапустите его из студии xamarin. Вероятно, он разбивает хранилище NSUserDefaults, чтобы проверить его, вы можете перезапустить приложение, нажав значок приложения на симуляторе.