Блок завершения 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;
}
В большинстве случаев это работает отлично. Однако иногда кажется, что устройство перегружено запросами на карты, а затем прекращает рендеринг. В моем файле журнала я увижу первый оператор журнала о "выделенном снимке", но никогда не увижу сообщение "Блок завершения снимка".
Возможно ли, что мои запросы никогда не выполняются из очереди отправки?
У кого-нибудь была эта проблема?
Ответы
Ответ 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. Теперь он работает.