2013-01-21 2 views
5

iOS의지도에 주석을 추가하는 것과 관련하여 성능 문제가 있습니다 (표준지도 키트 방법을 사용하므로 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 초 소요됩니다. 2. 매우 만족스러운 성능. 그러나, 내 자신의 응용 프로그램에서 동일한 기본지도보기를 포함 할 때 상황이 복잡해집니다. 똑같은 논리이지만, 앱에서 할 때 모든 주석을로드하는 데 약 50 초가 걸립니다.

내 앱에는 여러보기가 있습니다. 문제를 정확히 파악하기 위해지도보기를 최저 수준부터 시작하여 최상위 수준에 도달 할 때까지 시작했습니다. 각 단계에서 성능 향상에 도움이되는지 확인하기 위해 프로파일 링을했는데 결과가 표시되지 않습니다. 아직 약 50 초입니다. 바로 지금, 내 앱은 기본적으로 독립형 앱과 이상적으로 동일한 상단 및 유일한 레벨지도보기에 특수 효과를로드하고 추가하지만 어떤 이유로 든 주석 렌더링에는 약 50 초가 걸립니다. 내가 가진 유일한 합리적인 설명은 필자가 가지고있는 앱 설정 중 일부가지도 성능을 방해한다는 것입니다. 나는 아무 소용이없는 해결책을 내놓기 위해 독서를 다뤘다.

누구에게 무슨 문제가 있을지에 대한 아이디어가 있습니까? 감사!

+0

위대한 질문과 깊이/세부 사항. 불행히도 나는 그 해답을 알지 못한다. 그러나 StackOverflow에 대한 첫 번째 질문에서 나는 당신에게 박수를 보냅니다! – MCKapur

+0

MapKit을 많이 사용하지는 않았지만 다음과 같은 두 가지 옵션이 있습니다. 1) bg 스레드에서 수행하십시오 (작동하는지 확실하지 않음). 2) 정의 된 확대/축소에서 의미가있는 주석 만로드하십시오. 그래서 요가 매우 축소되면 20 개만 보여줄 수 있습니다. 한 번 확대하면 가능한 주석 수가 10k 미만이 될 것이므로 현재 뷰포트와 교차하는 다음 20 개의 중요도를 표시하십시오. – LocoMike

답변

0

실제로 "문제"가 없습니다. 즉, 실제로 응용 프로그램의 성능에 영향을 미치는 10000 개가 넘는 할당, 그리기 및 렌더링이 있습니다.

내 제안은지도에서 사용자 탐색을 차단하는 것입니다. [mapView visibleMapRect]과 같은 것을 사용하면 화면의 보이는 부분을 볼 수 있습니다. rect의 좌표를 가져 와서 (아마지도를 움직일 때 사용자가 알아 차릴 수 없을 정도로 조금 커질 수 있습니다) 그 rect 내의 주석 만로드하십시오.

사용자가 이동하면 이전 rect에 이미로드 된 주석 MINUS에있는 주석 만로드하면됩니다. 화면 밖으로 나가면 주석을 제거 할 수도 있습니다.

이것은 화면을 스크롤 할 때 Apple이 제안한 것과 조금 비슷합니다. 나는 사용자가 scrollview의 이전 섹션과 다음 섹션의 내용을로드해야하고 (이전 1 뷰의 내용을 릴리스해야하는) 응용 프로그램을 기억하므로 느린 메모리 사용량과 좋은 사용자 경험을 유지할 수 있습니다 .

사용자가보고있는 부분에 대해 생각해보십시오. 해당 부분 (또는 MKMapView 전문 용어로 불리는 영역)과 관련된 주석 만 표시하려고하면 앱 응답 성이 곧 개선 될 것이라고 생각합니다.