【问题标题】:Storing C struct array to core data or on disk?将 C 结构数组存储到核心数据或磁盘上?
【发布时间】:2013-07-18 18:45:27
【问题描述】:

我正在开发一个应用程序,该应用程序记录位置点并使用 MKPolyline 在 MapView 上绘制路径,这需要具有纬度和经度的位置点的 C 结构数组。目前,我将每个路径的 CLLocation 对象保存在 CoreData 中,但是当我想显示它们时,我需要枚举 CLLocation 并使用这些 CLLocation 点创建一个 C 结构数组。这是一个问题,因为如果要列举很多点,则需要更长的时间。

我正在寻找一种能够在磁盘上保存大量位置点并能够非常快速地加载它们并将它们添加到 MKPolyline 的解决方案。非常感谢您的帮助。

编辑:我的位置数组是CLLocationCoordinate2D 数组。

【问题讨论】:

  • 为什么这被否决了?
  • 尝试使用 CoreData。这是持久化大量数据的最佳方式。网上有很多关于如何使用 CoreData 的例子。
  • 你可以写一个值转换器。不确定它是否会产生相同的性能。可以去看看。
  • @Rakesh:我尝试了值转换器,但显然只有响应 encodeWithCoder: 的对象可以保存。
  • @Rakesh:如何使用 NSValue?

标签: ios objective-c c struct mkpolyline


【解决方案1】:

您是否考虑过使用Berkeley DB 或其他键值对数据存储库?它们往往非常快、非常轻巧,而且看起来人们已经让其中一些人在 iOS 上工作。 BerkeleyDB 现在归 Oracle 所有,对开源应用程序是免费的。

另一个流行的键值对存储是Kyoto Cabinet,它是 GPL 的。

Google 有一个 MIT 许可的键值存储,名为 LevelDB,看起来甚至还有一个 objective-C wrapper

【讨论】:

  • 感谢您提供的资源。它们看起来太复杂而无法实现,我正在寻找一种更简单的 iOS 方法来解决这个问题,但显然我做不到。如果我能弄明白,我以后可能会使用 Berkeley DB。看起来很有希望。
【解决方案2】:

我认为 NSValue 可以通过使用value:withObjCType: 来使用。但是根据文档,不能使用可变长度类型。

您指定的类型必须是恒定长度。你不能存储 C 字符串、可变长度数组和结构以及其他数据类型 NSValue 中长度不确定的——你应该使用 NSString 或 这些类型的 NSData 对象。

假设:

//Sample data    
typedef struct {
    CGFloat lat;
    CGFloat longi;
}Location;

Location list[2];
Location get[2];

Location l1;
l1.lat = 10.0;
l1.longi = 4.0;

Location l2;
l2.lat = 3.0;
l2.longi = 4.0f;

list[0] = l1;
list[1] = l2;

您可以根据您的要求使用NSData以下方式:

//This is the part you want
//create NSData
NSData *data = [NSData dataWithBytes:list length:sizeof(list)];

//get c array from NSData
[data getBytes:&get length:sizeof(list)];

//accessing 
methodUsingCarray(getList);
NSLog(@"%f",get[0].lat); // only if you need to access individual points

希望对你有帮助。

【讨论】:

  • 我尝试使用可转换属性在 CoreData 中存储,但由于您提到的相同限制,它不起作用。我在解析我的数组和分别保存点时没有问题,但我不想那样做!当我有一个包含数千个点的大型数组时,需要时间将其从存储格式转换为 C 数组并反转。不过感谢您的回答:)
  • @ArminM:这里你没有解析它。如果您仔细观察,C 数组存储为 NSData ,并且 无需解析枚举 您将在getList 中取回它。我刚刚制作的第一部分是为了获得一些示例数据。但是你只需要有效地做最后一部分。如果你想传递C数组,传递getList
  • 哦,好的,我明白了。看起来它应该可以工作,所以我会接受你的回答,直到我让它工作。这种方法有什么限制吗?我会通过将 C 结构保存到 Core Data 中来丢失任何东西吗?
  • 从技术上讲,您正在将 NSData 保存到 Core Data。无论如何,据我所知,这应该不是问题,并且这里没有违反任何规则。当您处理相当多的数据时,Core Data 将是正确的选择。它是一个非常强大的框架。
  • 好的,我使用了这个,它给出了一个编译器错误:“将CLLocationCoordinate2D发送到不兼容类型的参数const void*”我的数组是一个CLLocationCoordinate2D位置点数组。
猜你喜欢
  • 1970-01-01
  • 2017-03-30
  • 1970-01-01
  • 2011-04-12
  • 2012-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多