1

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

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

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

4

2 回答 2

1

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

您指定的类型必须是恒定长度。您不能在 NSValue 中存储 C 字符串、可变长度数组和结构以及其他不确定长度的数据类型——您应该为这些类型使用 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

希望能帮助到你。

于 2013-07-23T19:50:14.690 回答
1

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

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

Google 有一个 MIT 许可的键值存储,称为LevelDB,看起来甚至还有一个Objective-C 包装器

于 2013-07-23T20:23:09.657 回答