Два самых больших улучшения скорости, которые вы можете сделать здесь:
- Реализация представления аннотации для повторного использования (сейчас он создает новый вид каждый раз, когда ему нужно отобразить аннотацию, даже если тот же самый вид снова появляется.
- Изменить способ установки
UniqueID
. Чтобы установить его, код в настоящее время просматривает все аннотации каждый раз, когда создает представление аннотации (что может произойти всякий раз, когда представление карты масштабируется или прокручивается, а не только в начальный момент времени).
Во-первых, вместо поиска UniqueID
в методе viewForAnnotation
и использования тега кнопки для передачи идентификатора аннотации, добавьте UniqueID
в качестве свойства к вашему пользовательскому классу аннотаций MyLocation
и установите свойство при добавлении самой аннотации в addPins
:
annotation.uniqueID = info.UniqueID; // <-- give id to annotation itself
[mapViewLink addAnnotation:annotation];
Вы также можете добавить uniqueID
в качестве параметра к методу initWithName
вместо того, чтобы назначать свойство отдельно.
Далее, чтобы реализовать повторное использование представления аннотации, метод viewForAnnotation
должен выглядеть следующим образом:
- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>) annotation{
if (annotation == mapView.userLocation){
return nil; //default to blue dot
}
NSString *reuseId = @"StandardPin";
MKPinAnnotationView *annView = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:reuseId];
if (annView == nil)
{
annView = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:reuseId] autorelease];
annView.pinColor = MKPinAnnotationColorRed;
annView.animatesDrop = YES;
annView.canShowCallout = YES;
annView.calloutOffset = CGPointMake(-5, 5);
UIButton *advertButton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
advertButton.frame = CGRectMake(0, 0, 23, 23);
advertButton.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;
advertButton.contentHorizontalAlignment = UIControlContentHorizontalAlignmentCenter;
annView.rightCalloutAccessoryView = advertButton;
}
else
{
//update the annotation property if view is being re-used...
annView.annotation = annotation;
}
return annView;
}
Наконец, чтобы отреагировать на нажатие кнопки и выяснить, для какого UniqueID
показывать подробности, реализуйте метод делегата calloutAccessoryControlTapped
:
- (void)mapView:(MKMapView *)mapView annotationView:(MKAnnotationView *)view
calloutAccessoryControlTapped:(UIControl *)control
{
MyLocation *myLoc = (MyLocation *)view.annotation;
int uniqueID = myLoc.uniqueID;
NSLog(@"calloutAccessoryControlTapped, uid = %d", uniqueID);
//create, init, and show the detail view controller here...
}
После всех этих изменений только первоначальная загрузка аннотаций займет большую часть времени. Если это все еще проблема, одним из решений является добавление только аннотаций, которые будут видны в отображаемой в данный момент области, и добавление / удаление аннотаций, когда пользователь изменяет видимую область.