【问题标题】:Saving a location Array to NSUserDefaults将位置数组保存到 NSUserDefaults
【发布时间】:2014-03-31 12:03:30
【问题描述】:

我正在尝试构建一个跟踪路线的应用程序,然后将路线存储在 parse.com 中,这样我就可以使用 MKpolyline 覆盖用户采取的路线。

我是 Objective-c 和 IOS 开发的新手,所以请原谅我的无知!

当我尝试保存所采取的路线时,我卡住了,然后发送/保存位置数组,以便我可以在用户完成活动时打开的下一个视图控制器上重建 MKpolyline。

我不确定是将位置数组保存到 NSUserDefaults 还是将其保存到核心数据。目前我正在将 Array 转换为 NSValue 并将其保存到 NSUserDefaults,如下所示:

 count = [self.locations count];

        CLLocationCoordinate2D coordinates[count];
        for (NSInteger i = 0; i < count; i++) {
            coordinates[i] = [(CLLocation *)self.locations[i] coordinate];
            NSValue *locationValue = [NSValue valueWithMKCoordinate:coordinates[i]];
            [_locationsArray addObject:locationValue];




 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    [defaults setObject:totalDistance forKey:@"totalDistance"];
    [defaults setObject:_locationsArray forKey:@"mapOverlay"];
   // [defaults setDouble:_totalTime forKey:@"totalTime"];
    [defaults setObject:avgSpeedToBeSaved forKey:@"averageSpeed"];
    [defaults setObject:totalCalories forKey:@"totalCalories"];

    [defaults synchronize];

这是正确的方法吗?以及如何重建位置数组。

如果有人能指出我正确的方向,将不胜感激。

我现在已将我的代码更改为 manecosta 建议的代码,以重建 CLLocationCoordinates 以创建 MKPolyline,但我现在的问题是数组为 Null,从我开始转换为 NSValue 的位置开始。我无法弄清楚为什么会这样,首先我构建 LocationsArray 的方式有问题吗?

【问题讨论】:

  • 您是否尝试过使用 objectForKey: 从 userDefaults 中读取对象?数组将被适当地重新创建。
  • @Merlevede 我不需要坐标来构建 MKPolyline 吗?而不是 NSValues?谢谢

标签: ios objective-c core-data nsuserdefaults


【解决方案1】:

您可以使用objectForKey:从NSUserDefaults获取对象

正如你所拥有的[defaults setObject:totalDistance forKey:@"totalDistance"];。

现在,如果您想从 NSUserDefaults 中取回 totalDistance,那么您可以使用以下代码:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];
NSArray *arrayLocation = [defaults objectForKey:@"totalDistance"];

但是给你的一条建议是不要在你的项目中使用NSUserDefaults。 NSUserDefaults 只能用于存储少量数据(这只是个人意见。)。你的locationArray 会很大。正确的?

NSUserDefaults 和 CoreData 两个选项之间的一个很好的比较 What are the limitations of NSUserDefaults?

我在这里发布答案(来自上面的链接 - 以防问题在未来变得不可用 - 谁知道!!)

NSUserDefaults 提供了简单的学习曲线和线程安全 实施。

否则,我发现 Core Data 在各方面都更胜一筹。特别是与 关于配置默认值和迁移例程。

编辑:我实际上没有尝试过,但似乎是这样的.. 如果它不起作用,请告诉我。

从NSValue取回NSArray

NSValue *value = [defaults objectForKey:@"mapOverlay"];
NSArray *arrayTemp;
[value getValue:&arrayTemp];

【讨论】:

  • 关于 NSUserDefaults 的信息不正确。它不使用主线程。最有可能的是,他们自己在主线程上调用了同步(在大多数情况下根本不需要调用同步)。
  • @Akshit Zaveri 是的,我认为 NSUserDefaults 应该只用于小数据,因为位置数组可能非常大!但是我遇到的问题是我无法将 CLLocations 数组作为结构保存到 NSUserDefaults 中?所以我将其转换为 NSValue,但我不确定如何获取坐标以重建我的 MKpolyline 叠加层。
  • @user3254994,, 试试这个 -> NSValue *value = [defaults objectForKey:@"mapOverlay"]; NSArray *arrayTemp; [value getValue:&amp;arrayTemp];
  • 我绝对信任他。那就是我从我的答案中删除了不正确的信息。&也对他的评论投了票。@Zaph
  • 我之所以说大多数情况,是因为它还有一些有用的地方:) 我会详细说明,以防有人关心。 1) 从您的流程之外获取更改(例如在设置中所做的更改)。 2)立即保存数据,而不是几秒钟。这最有用的地方是在开发时,因为 Xcode 中的“停止”基本上与使您的应用程序崩溃相同。但是,即使在 Xcode 之外,如果用户启动了一个大型游戏,您的应用程序也可能由于内存不足而被终止。如果它不是其中之一,它不会解决任何问题。
【解决方案2】:

是的,我猜你做对了,重建只是做相反的事情,应该是这样的:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

NSArray *locationsArray = [defaults objectForKey:@"mapOverlay"];

CLLocationCoordinate2D coordinates[[locationsArray count]];
NSInteger i = 0;
for(NSValue *locationValue in locationsArray){
    coordinates[i] = [locationValue MKCoordinateValue];
    i++;
}

关于您使用用户默认值来存储大量数据的事实。我真的不知道什么是正确的,但我会告诉你,我以前用它来存储我的应用程序的缓存,这些缓存是相当大的数组和字典,它从来没有让我失望过。

【讨论】:

  • 谢谢你,我认为这会解决问题,但我得到一个错误 - 线程 1: EXC_BAD_ACCESS(code=1, address=0x9c6dd7498
  • 在将位置数组保存到 NSUserDefaults 之前,我已经对位置数组进行了 NSLog,它是 NULL 是我在将位置数组传送到 NSVales 时可能做错了什么吗?
猜你喜欢
  • 2011-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-15
  • 1970-01-01
  • 2021-04-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多