将C struct数组存储到核心数据或磁盘上?

时间:2013-07-18 18:45:28

标签: ios objective-c c struct mkpolyline

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

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

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

2 个答案:

答案 0 :(得分:1)

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

  

您指定的类型必须是恒定长度。你不能存储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

希望它有所帮助。

答案 1 :(得分:1)

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

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

Google拥有一个名为LevelDB的麻省理工学院许可的键值存储,看起来甚至还有objective-C wrapper