2012-02-10 101 views
1

嗨我的應用程序運行良好,它將註釋從不同的plists加載到幾個不同的地圖。顯示註釋的數量限制

我的問題是我的一個plist上有大約5000個註釋,而地圖視圖大約需要20秒來顯示註釋。

有沒有什麼辦法可以限制當前位置20公里半徑的註釋量?

這會縮短加載時間嗎?

我不想從頭開始重做所有事情,並建立一個數據庫,因爲我基本上都是這樣做的,所以我有一個plist。

+0

我認爲唯一的選擇是將大型plist拆分成覆蓋較小區域的小型plist。然後根據當前位置,只加載位於或靠近當前位置的plist(s)。另外,「Xcode」就是IDE,問題不在於IDE。我已將標籤更新爲「ios」。 – Anna 2012-02-10 13:32:00

+0

謝謝安娜聽起來像要走的路,所以我將不得不建立一個if語句來加載某個經緯度之間的區域的某個plist?說澳大利亞有7個州,我應該設立7個聲明? – 2012-02-11 01:56:59

回答

1

我建議的選擇,如果你想留在plists,是打破大plist到較小的覆蓋較小的區域。

如果將它們分成7個澳大利亞州,可以提供您需要的表現水平,那就沒問題了。但我會創建更小的區域(全部是矩形),每個區域都覆蓋固定的N個度數。 N不應該太小,也不要太大(這取決於您想要顯示數據的當前位置有多遠)。

例如,你可以打破單一的plist到這樣的16個區域(它沒有成爲一個平方數):

  North 

     A B C D 
West E F G H East 
     I J K L 
     M N O P 

     South 

的plist「A」將包含註釋的數據說緯度012到 Plist「B」將包含Lat 50到51和Lon 110到120的註釋數據。
Plist「E」將包含Lat 49到50和Lon 100到110的註釋數據。
等。

我還會有一個額外的「索引」plist,它可以讓應用找出哪個座標位於哪個plist中,以及plist的鄰居是什麼。如果當前位置靠近區域的邊緣,應用程序就可以從當前位置的plist及其鄰居讀取註釋數據。

該指數的plist的結構可能是這樣的:

PlistName NWCoordinate SECoordinate Neighbors 
A   51,100  50,110  B, E, F 
F   50,110  49,120  A, B, C, E, G, I, J, K 

指數的plist將一次在應用程序的啓動時讀取。

然後,一旦應用程序有當前位置(或者當它改變顯著不夠),應用程序將執行以下操作:

  • 從地圖上刪除現有的註釋。
  • 使用該索引來確定從哪個plist(s)加載新註釋。假設當前位置是49.25,112.3。使用索引,應用程序將F plist及其鄰居加載到某個數組中(而不是一次直接映射到地圖)。
  • 使用addAnnotations一次性添加數組中的註釋。
1

5,000點是不是很多,我有數據庫有100,000點,它仍然明顯快於(我沒有使用MapKit)。如果需要20秒,那麼它必須爲每個標記進行某種網絡流量?

您的plist是否包含每個標記的緯度/經度?如果是這樣,則可以爲地圖上的每個標記創建一個CLLocation對象,併爲地圖中心創建一個CLLocation對象,然後使用[mapCentre distanceFromLocation:markerLocation]計算從中心到標記的距離(以米爲單位)。

放下任何不在地圖上的東西,你應該很好走。

如果你想將你的plist分割成更小的文件,我會根據它們的位置來分割它們。例如,任何經緯度以125.1/-19.1開頭的標記都將位於單個文件中。

我和澳大利亞一起工作的經歷就像墨爾本這樣的城市在很小的地區有很多東西,而這個國家的其他地方几乎空無一人。所以很難將東西分成更小的塊。

此外,通過樂器中的「時間檔案」功能運行您的應用程序,以找出真正需要這麼久的內容。這是Xcode中的Product -> Profile菜單項。你可以找到很多教程如何在線使用它。