Производительность Toubleshooting mapkit

Я вывожу более чем 500 точек на печать на карте с помощью mapkit. Изменение масштаба является немного нервным по сравнению с собственным приложением карты Google. Я обнаружил то, что вызывает замедление. Я добавляю пользовательские аннотации так, чтобы я мог позже добавить различные цвета контакта и кнопки для представлений детали:

- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(AddressNote *) annotation {
    MKPinAnnotationView *annView=[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"currentlocation"];
    annView.pinColor = MKPinAnnotationColorGreen;
    annView.animatesDrop=TRUE;
    annView.canShowCallout = YES;
    annView.calloutOffset = CGPointMake(-5, 5);
    return annView;
}

Если я комментирую вышеупомянутый код, все хорошо работает. Очень гладкий с изменением масштаба в/. Я должен добавлять аннотации по-другому для повышения производительности?

8
задан RedBlueThing 8 February 2010 в 02:23
поделиться

5 ответов

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

- (MKAnnotationView *)mapView:(MKMapView *)mapView
            viewForAnnotation:(id <MKAnnotation>)annotation
{
    MKPinAnnotationView *view = nil;
    if (annotation != mapView.userLocation) {
        view = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:@"identifier"];
        if (nil == view) {
            view = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"identifier"] autorelease];
        }
        [view setPinColor:MKPinAnnotationColorGreen];
        [view setCanShowCallout:YES];
        [view setAnimatesDrop:NO];
    }
    else {
        // Do something with the user location view
    }
    return view;
}

Кроме того, с 500 выводами анимация отбрасывания занимает много времени. Вы должны отключить это с помощью [view setAnimatesDrop: NO]

6
ответ дан 5 December 2019 в 12:58
поделиться

Я написал приложение для iPhone для клиента, и мы включили в него локатор магазина для одной из их торговых марок. Он включает в себя 501 местоположение, и в то время как анимация может быть немного вялой, когда вы увеличиваете масштаб для просмотра всей территории Соединенных Штатов, она идеально подходит для масштабирования до уровня штата, где видна только горстка булавок.

Кнопки:

  • Увеличить пользователя в их текущее местоположение, прежде чем добавлять аннотации.
  • Повторное использование представлений аннотаций с помощью dequeueReusableAnnotationViewWithIdentifier:.

Для достижения первой точки необходимо включить обновление местоположения и установить флаг при получении первой точки. Анимируйте карту к этому местоположению, используя диапазон области, который имеет смысл для вашего приложения, затем в mapView:regionDidChangeAnimated: проверьте, нужно ли добавить аннотации и , что текущее местоположение было обновлено, прежде чем вызывать addAnnotation:.

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

Кстати, я полагаю, что у вас утечка памяти в вашем коде, как описано выше. Даже если вы не хотите использовать механизм удаления, вид, который вы возвращаете с mapView:viewForAnnotation: должен быть автореализован.

3
ответ дан 5 December 2019 в 12:58
поделиться

Мне кажется, что добавлять 500 точек карты к участку карты размером с экран iPhone не имеет смысла. Нет никакого способа визуализировать это или даже нажать на правую аннотацию.

Неужели вы не можете посмотреть на уровень масштабирования и центр карты, а затем решить добавить на карту только подмножество примечаний?

Думаю, я видел, как другие приложения тоже это делают.

1
ответ дан 5 December 2019 в 12:58
поделиться

Я думаю, что St3fan прав. Теоретически вы можете просто добавлять аннотации на карту и позволить представлению обрабатывать их отображение, но реальность такова, что лучше, если вы немного уменьшите отсчет, 500 на экране одновременно было бы слишком много, чтобы увидеть в любом случае.

Однако есть еще один шаг, который нужно попробовать - убедиться, что для всех видов аннотаций непрозрачность задана как ДА, например:

annView.opaque = YES; 
2
ответ дан 5 December 2019 в 12:58
поделиться

Если вы не удаляете из просмотра аннотации, не видимые пользователем, это одно, что можно сделать с помощью MKMapViewDelegate. Если производительность снижается, когда пользователь уменьшает масштаб до уровня страны, вы можете захотеть представить агрегированную информацию на уровнях масштаба > некоторого значения const, например, вместо 30 аннотаций в пределах 10 квадратных миль показать одну аннотацию, как [30 что-то].

1
ответ дан 5 December 2019 в 12:58
поделиться