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, чтобы проверить его, вы можете перезапустить приложение, нажав значок приложения на симуляторе.