2011-03-22 5 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

Не полагайтесь на заказ аннотаций в свойстве annotations MKMapView.

Отображение карты будет отображаться независимо от того, какие аннотации принадлежат экрану, учитывая текущий диапазон отображения и масштабирование. Возможно, внутреннее представление карты даже не сохраняет аннотации в виде массива. В конце концов, он должен иметь возможность находить все аннотации, которые географически близки к текущему региону, и массив не является структурой, которая лучше всего подходит для этого.

Если вы хотите, чтобы аннотации отсортировались определенным образом, вы должны поддерживать свой собственный массив. Вы можете использовать этот массив для добавления аннотаций в представление карты при его настройке. Однако для обновления списка аннотаций вам следует добавить или удалить только те аннотации, которые вы добавили или удалили из своего списка. То есть, вероятно, неэффективно удалить весь список аннотаций, а затем добавить целый новый список, если большинство аннотаций в новом списке одинаковы.

+0

Конечно, порядок важен, потому что отсортированный список аннотаций позволяет мне выполнять двоичный поиск вместо линейного поиска. На карте, содержащей около 600 аннотаций, она уменьшает средний результат от 300 сравнений до 9. Кроме того, MKMapView использует NSArray для хранения аннотаций, как показано на странице http://developer.apple.com/library/ios/#documentation /MapKit/Reference/MKMapView_Class/MKMapView/MKMapView.html, но я не уверен, как его подклассы. – Drahcir

+1

Свойство 'annotations' предоставляет массив, но это не обязательно, как MKMapView сохраняет данные. Помните: свойства - это просто обещание предоставить определенные аксессоры. Массивы представляют собой одномерные объекты, но MKMapView требует сортировки аннотаций в 2 измерениях, и для этого существуют более сложные структуры, чем массивы. Кроме того, нет гарантии, что MKMapView сохранит порядок аннотаций в массиве, который вы ему даете. Вы должны сохранить свой собственный отсортированный список аннотаций, а не полагаться на MKMapView, чтобы сохранить свой заказ для вас. – Caleb

+0

Подумав об этом, я считаю, что ваше предложение сделать мой собственный отсортированный список - лучшая идея. Мне не нужно отслеживать аннотации через фактический mapview, я могу просто имитировать его, сделав копию, а затем добавив к фактическому виду карты позже. Хотя ваш ответ на самом деле является вопросом и не дает ответа, ваш комментарий был полезен, поэтому я все равно соглашусь. Возможно, вы могли бы отредактировать его, чтобы скрыть ответ? – Drahcir