2011-03-22 90 views
1

由於性能的原因,我需要在我的註釋列表上做一個二進制插入,但是當我到達需要插入註釋的部分後,我意識到我的mapView與一個NSMutableArray,所以我不能在列表中間自由添加註釋。MKMapView如何創建insertAnnotationAtIndex

while (first <= last) { 
    NSUInteger mid = (first + last)/2; 
    if ([name compare:[mapView.annotations objectAtIndex:mid]] == NSOrderedDescending) { 
     first = mid + 1; 
    } else if ([name compare:[mapView.annotations objectAtIndex:mid]] == NSOrderedAscending) { 
     last = mid - 1; 
    } else { 
     Annotation *destination = [[Annotation alloc] init]; 
     [destination setTitle:name]; 
     [destination setSubtitle:sub]; 
     [destination setCoordinate:coords]; 
     // method doesn't exist, but how do I create/simulate this? 
     [mapView insertAnnotation:destination atIndex:mid]; 
     [destination release]; 
     return; 
    } 

} 

是否可以擴展mapview並創建我自己的類來做到這一點?如果是這樣,我將如何去在索引處添加註釋?

回答

1

不要依賴MKMapView的annotations屬性中的註釋順序。

給定地圖視圖的當前跨度和縮放比例,地圖視圖將顯示屏幕上顯示的任何註釋。可能在內部,地圖視圖甚至不將註釋存儲爲數組。畢竟,它需要能夠找到地理上接近當前區域的所有註釋,而數組不是最適合這種情況的結構。

如果你想保持註釋以某種方式排序,你應該維護自己的數組。您可以使用該數組在設置時將註釋添加到地圖視圖。但是,對於註釋列表的更新,您應該只添加或刪除已添加或從列表中刪除的註釋。也就是說,如果刪除整個註釋列表,並且在新列表中的大多數註釋都相同時添加一個全新列表可能效率不高。

+0

當然,順序很重要,因爲排序的註釋列表允許我執行二分搜索而不是線性搜索。在包含大約600個註釋的地圖上,它將平均查找次數從300次比較降低到大約9次。此外,MKMapView使用NSArray來保存註釋,如http://developer.apple.com/library/ios/#documentation /MapKit/Reference/MKMapView_Class/MKMapView/MKMapView.html,但我不知道如何子類化它。 – Drahcir 2011-03-23 12:50:45

+1

'annotations'屬性提供了一個數組,但這不一定是MKMapView如何存儲數據。請記住:屬性只是提供某些訪問者的承諾。數組是一維對象,但MKMapView需要對二維的註釋進行排序,並且比數組有更好的結構。此外,不能保證MKMapView將保留您給它的數組中的註釋順序。你應該保留你自己的排序列表的註釋,而不是依靠MKMapView來保存你的訂單。 – Caleb 2011-03-23 13:27:36

+0

經過深思熟慮之後,我相信你對自己排序列表的建議是一個更好的主意。我不必通過實際的mapview跟蹤註釋,我可以通過製作一個副本並稍後添加到實際的mapview來模擬它。雖然你的回答實際上是一個問題,並沒有提供答案,但你的評論很有用,所以我會接受它。也許你可以編輯它來包含答案? – Drahcir 2011-03-23 14:12:45