Блок завершения iOS MKMapShapshotter не всегда называется - программирование
Подтвердить что ты не робот

Блок завершения iOS MKMapShapshotter не всегда называется

Я пытаюсь использовать новый iOS7 MKMapSnapshotter для создания статического изображения карты. Всякий раз, когда моему приложению нужна карта, я вызываю следующее:

MKMapSnapshotter *snapshotter = [[[MKMapSnapshotter alloc] initWithOptions:theOptions] autorelease];
dispatch_queue_t aQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_BACKGROUND, 0);
DebugLog(@"Snapshotter allocated %@ and run on queue %@", snapshotter, aQueue);

[snapshotter startWithQueue:aQueue completionHandler:^(MKMapSnapshot *snapshot, NSError *error) {
    DebugLog(@"Snapshotter completion block %@", snapshotter);
    // perform selector on main thread to set self.imageView.image = shanpshot.image;
}

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

Возможно ли, что мои запросы никогда не выполняются из очереди отправки? У кого-нибудь была эта проблема?

4b9b3361

Ответ 1

Это (или кажется) ошибка в MKMapSnapshotter.

Если сетевые данные и Wi-Fi отключены, обработчик завершения не будет называться (если в ОС нет данных кэширования - см. fooobar.com/questions/433128/... для очистки кеша).

Фактически, снимок, кажется, блокирует ожидание данных. Это не время или не обнаруживает, что данных нет. Через много минут, например, 15 минут, snapshotter.isLoading = YES. Вызов cancel не вызывает вызов обработчика завершения.

Если WiFi или сетевые данные снова включены, последующие вызовы для запуска (нового) снимка вызовут обработчик завершения.

Это s * cks плохо, если переменная задана при запуске и очистке снимка в обработчике, потому что переменная никогда не очищается.

if (!isRendering) {
    isRendering = YES;

    [snapshotter startWithCompletionHandler:
     ^(MKMapSnapshot* snapshot, NSError* error) {
         // This may not be called so this code will
         // never run again.
         isRendering = NO;
     }];
}

Ответ 2

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

Ответ 3

Имела ту же проблему в разных версиях iOS. Дело в том, что приложение AppleMaps также неправильно загрузило карты. Перезагрузка устройства сильно заставила его работать. Поэтому я предполагаю, что это ошибка Apple.

Ответ 4

У меня такая же проблема. Причина была в MKMapSnapshotOptions, где я установил очень малую область. Я устанавливаю значения по умолчанию для дельта-долготы и дельта-широты как 0,05. Теперь он работает.