Обнаружение, когда отображаются плитки MapView

Поскольку - (void)mapViewDidFinishLoadingMap:(MKMapView *)mapView не вызывается, когда плитки загружаются из кэша, есть способ узнать, когда все плитки были загружены (либо из кэша, либо с картографических серверов) и отображается?

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

7 голосов | спросил Iñigo Beitia 30 J000000Monday12 2012, 23:23:26

2 ответа


0

Вот небольшой исходный код, который я написал: https://github.com/jonathanlking /mapViewTest

Почему бы вам не подумать о такой проблеме?

Когда вид карты изменится, будет вызван mapView:regionDidChangeAnimated:.

Оттуда будет вызываться mapViewWillStartLoadingMap:.

Далее будет mapViewDidFailLoadingMap:withError: или mapViewDidFinishLoadingMap: вызываться, если плитки были получены с сервера.

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

ответил Jonathan King 8 PM00000090000001131 2012, 21:52:11
0

Как уже упоминалось, mapViewDidFinishLoadingMap иногда вообще не вызывается, особенно если фрагменты карты уже кэшированы, а иногда - множественные раз.

Я заметил, что когда он вызывается несколько раз при последнем вызове, отображаются все плитки. Поэтому я думаю, что вы можете заставить это работать, если вы установите 2-секундный таймер после того, как карта начнет меняться. Отключите взаимодействия, чтобы карта не продолжала изменяться, и включите взаимодействие с пользователем, когда таймер отключится.

Если вызывается mapViewDidFinishLoadingMap, снова включите таймер на 2 секунды в будущем. Когда таймер наконец сработает, у вас должна быть полностью отрендеренная карта.

Вы можете рассмотреть другие обратные вызовы, такие как mapViewDidFailLoadingMap. Также проверьте это на шумном соединении, так как 2 секунды могут быть недостаточно длинными, если для извлечения плиток требуется много времени.

- (void)restartTimer
{
    [self.finishLoadingTimer invalidate];
    self.finishLoadingTimer = [NSTimer scheduledTimerWithTimeInterval:2.0
                                                               target:self
                                                             selector:@selector(mapLoadingIsFinished)
                                                             userInfo:nil
                                                              repeats:NO];
}

- (void)mapLoadingIsFinished
{
    self.finishLoadingTimer = nil;
    self.mapChanging = NO;
    self.view.userInteractionEnabled = YES;
}

- (void)mapViewDidFinishLoadingMap:(MKMapView *)mapView
{
    if (self.mapChanging) {
        [self restartTimer];
    }
}

- (void)startLookingForMapChange
{
    assert(self.mapChanging == NO);
    if (self.mapChanging == NO) {
        self.mapChanging = YES;
        assert(self.finishLoadingTimer == nil);
        self.view.userInteractionEnabled = NO;
        [self restartTimer];
    }
}
ответил Skotch 17 Jpm1000000pmThu, 17 Jan 2013 22:41:55 +040013 2013, 22:41:55

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132