12

我只是想保存/恢复几个双打。我所看到的是它在连接到调试器时可以工作,但在应用程序关闭 15 分钟后 - 重新启动应用程序并为两个双打恢复“-180”。

这看起来对吗?或者你认为我以某种方式保存“-180”?

这是设备而不是模拟器。我正在使用Map.DidUpdateUserLocationwhich 给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 ();
    }
4

4 回答 4

4

这个问题已经很老了,但出于一个原因,它让我大吃一惊,我们看到了非常奇怪的行为,将 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
于 2015-03-06T16:59:09.667 回答
2

也许您可以使用 nuget 包来处理(PCL)设置,您可以在 github 上找到或通过 nuget 安装这里

过去我在很多项目中都使用过这个库,从来没有给我任何奇怪的值。请注意,如果您确实看到'-180' 再次出现,这意味着代码中某处的某些东西正在写入该值。

于 2015-09-07T12:30:29.127 回答
0

-180 绝对看起来很可疑,因为它不是 0 或 MAX 双倍并且似乎与坐标有关。也许您在位置管理器有时间定位用户之前就已经获取了用户的位置。您可以检查位置管理器给您的读数是否不超过约 15 秒。它通常会在获取最新位置时为您提供最后一个位置锁定。-180 可能是模拟器为您提供的“最后已知位置”。

我不知道 monotouch,但看起来你正在调用正确的方法。

于 2013-08-06T23:21:41.760 回答
0

我发现从 xamarin studio 重新启动后,模拟器中的应用程序 ID 会发生变化。可能它会破坏 NSUserDefaults 存储,要检查它,您可以通过触摸模拟器上的应用程序图标来重新启动应用程序。

于 2015-09-03T08:00:23.710 回答