2013-07-18 77 views
1

我正在使用MKPolyline記錄位置點並在MapView上繪製路徑的應用程序,該程序需要帶有經度和緯度的位置點的C結構數組。目前我在CoreData中爲每個路徑保存CLLocation對象,但是當我想要顯示它們時,我需要枚舉CLLocations並用這些CLLocation點創建一個C結構數組。這是一個問題,因爲如果有很多要枚舉的點需要更長的時間。將C結構數組存儲到核心數據或磁盤上?

我正在尋找能夠在上節省大量位置點的解決方案,並且能夠非常快地加載它們並將它們添加到MKPolyline。我將衷心感謝您的幫助。

編輯:我的位置數組是一個CLLocationCoordinate2D數組。

+0

這是爲什麼被低估? – 2013-07-18 18:47:49

+0

嘗試使用CoreData。這是堅持大量數據的最佳方式。有很多關於如何在Internet上使用CoreData的例子。 –

+0

你可以寫一個值轉換器。不知道它是否會產生相同的性能。可以檢查出來。 – Rakesh

回答

1

我以爲可以通過使用value:withObjCType:來使用NSValue。但根據文檔變長的類型不能使用。

The type you specify must be of constant length. You cannot store C strings, variable-length arrays and structures, and other data types of indeterminate length in an NSValue—you should use NSString or NSData objects for these types.

假設這樣的:

//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 

希望它能幫助。

+0

我已經嘗試使用可變形屬性存儲在CoreData中,但由於您提到的限制,它不起作用。我沒有問題解析我的數組和分開保存點,但我不想這樣做!當我有一個有數千個點的大型數組時,它需要花費時間從存儲格式轉換爲C數組並進行反轉。感謝您的答案:) – Armin

+0

@ArminM:在這裏你不解析它。如果仔細觀察,C數組存儲爲NSData,並且**不分析**或**枚舉**,您將它返回到'getList'中。我剛剛做的第一部分是我有一些樣本數據。但是您只需要有效地完成最後一部分。如果您想傳遞C數組,請傳遞'getList'。 – Rakesh

+0

哦,好吧,我明白了。它似乎應該工作,所以我會接受你的答案,直到我使它工作。這種方法有什麼限制嗎?通過將C結構保存到核心數據中,我會失去任何東西嗎? – Armin

1

您是否考慮過使用Berkeley DB或其他鍵值數據存儲庫?他們往往非常快速,非常輕便,而且看起來人們已經從iOS中獲得了一些工作。 BerkeleyDB現在由Oracle擁有,它對開源應用程序是免費的。

另一個熱門的鍵值存儲是Kyoto Cabinet,這是GPL'd。

Google擁有一家名爲LevelDB的麻省理工學院授權的鍵值超級商店,看起來好像還有一個objective-C wrapper

+0

感謝您建議的資源。他們看起來實在太複雜了,我正在尋找更簡單的iOS方法來解決這個問題,但顯然我不能。如果我能弄清楚,我可能會稍後使用Berkeley DB。它看起來很有希望。 – Armin