2013-01-21 65 views
5

我在iOS中使用標準mapkit方法(因此使用Apple地圖)向地圖添加批註時遇到了性能問題。我正在嘗試使用(void)addAnnotations:(NSArray *)annotations方法批量添加大量批註(10000+)。註釋對象是沒有什麼特別的 - 即只定義爲構造實現MKAnnotation遵循一個非常基本類:向地圖添加批註太慢 - iOS

- (id)initWithTitle:(NSString *)ttl andCoordinate:(CLLocationCoordinate2D)c2d { 
    if(self = [super init]) { 
     title = ttl; 
     coordinate = c2d; 
    } 

    return self; 
} 

爲了測試,我創建了一個基本的應用程序,只需添加註釋基本地圖在iPad上查看,大約需要6-7秒。非常可以接受的性能。但是,當我在自己的應用程序中嵌入相同的基本地圖視圖時,情況變得複雜。這是完全相同的邏輯,但是當我在我的應用程序中執行此操作時,大約需要50秒才能加載所有註釋。

我的應用程序有一堆彼此之間的意見。爲了查明問題,我已經開始從最底層開始嵌入地圖視圖,直到達到頂層。我已經完成了每一步的分析,看看它是否有助於性能,但我沒有看到任何結果 - 它仍然在50秒左右。現在,我的應用程序基本上只是加載註釋並將其添加到頂級和唯一級別的地圖視圖中,理想情況下與獨立應用程序相同,但無論出於何種原因,我仍然會看到註釋渲染大約需要50秒。我擁有的唯一合理解釋是關於某些應用程序設置,我以某種方式干擾了地圖的性能。我已經做了一堆閱讀來提出解決方案無濟於事。

任何人有什麼想法可能是這裏的問題?謝謝!

+0

偉大的問題和深度/細節。不幸的是,我不知道答案,但對於StackOverflow的第一個計時問題,我必須爲你鼓掌! – MCKapur

+0

我沒打過很多MapKit的,但這裏有2種可能的選擇:1)嘗試在BG線程(不知道是否會工作)這樣做。 2)只加載在定義的縮放中有意義的註釋。所以,如果喲非常縮小,你只有一個顯示也許20,當你放大,可能的註釋的數量將小於10K,那麼表明你相交當前視未來20更重要的......等等。 – LocoMike

回答

0

沒有實際的「問題」。我的意思是,你有超過10000個分配,繪製和渲染,實際上會影響應用程序的性能。

我的建議是攔截地圖上的用戶導航。使用諸如[mapView visibleMapRect]之類的東西來獲取屏幕上可見的地圖部分。獲取矩形的座標(也許有一點大一點,以便在移動地圖時用戶不會注意到),並只加載該矩形內的註釋。

隨着用戶的移動,您只需加載新rect中的註釋,然後減去之前rect中已加載的註釋。我猜你也可以在註釋離開屏幕時將其刪除。

這類似於一點點蘋果公司建議用滾動視圖打交道時做的。我記得用戶必須加載滾動視圖的前一部分和下一部分的內容(並釋放先前1視圖的內容)的應用程序,以便具有緩慢的內存消耗並仍然保持良好的用戶體驗。

試着去思考用戶在看什麼,試着只顯示那些影響該部分的註釋(或者是在MKMapView行話中調用的區域),我認爲你的應用響應能力會立即提高。