iOS5 Что означает «Отбрасывание сообщения для события 0 из-за слишком большого количества необработанных сообщений»?

#ios #xcode #performance #debugging

#iOS #xcode #Производительность #отладка

Вопрос:

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

 Discarding message for event 0 because of too many unprocessed messages
  

в консоли xcode. Что именно это означает?

Комментарии:

1. Я тоже был свидетелем этих сообщений. Не уверен, что является причиной этого.

2. Недавно я получил это сообщение с помощью MapKit на iOS 5.1.1. Не смог понять, в чем проблема, но перезапуск моего iPhone исправил ее!!

Ответ №1:

Вот что говорит об этом служба технической поддержки Apple (после оплаты 49 долларов США за инцидент с технической поддержкой разработчиков):

Эти сообщения поступают из Core Location framework. Наиболее вероятной причиной этих сообщений является то, что в потоке, в котором был создан CLLocationManager, не выполняется цикл выполнения. (Это означает, что CLLocationManager не был создан в основном потоке.) Отбрасываемые сообщения — это сообщения о местоположении: например, событие 0 — это местоположение, а событие 24 — это обновление статуса авторизации. Поскольку сообщения отбрасываются, вы не увидите, что вызываются соответствующие обратные вызовы делегатов. Вы настроили геозону или какой-либо другой обратный вызов и недостаточно быстро его обслуживаете? Ограничение очереди, по-видимому, равно 10, прежде чем оно начнет сбрасывать события и регистрировать это сообщение. Эта информация еще не задокументирована публично. Я работаю с командой Core Location, чтобы улучшить сообщения, о которых сообщается, и посмотреть, можно ли это лучше документировать.

Комментарии:

1. Спасибо за это — я бы некоторое время ломал голову над тем, почему не запускались обратные вызовы делегатов. Я просто завернул [[CLLocationManager alloc] init] в блок dispatch_async(dispatch_get_main_queue(), ^{…}), чтобы заставить это работать

2. На мой взгляд, 49 долларов стоят 600 повторений.

3. Оно того стоит. Они включены в документацию, которая CLLocationManager выполняется, RunLoop но все же многие из нас отсутствуют

Ответ №2:

Майкл прав, причина в том, что диспетчер местоположений может запускаться только в потоке, в котором запущен цикл (основной поток по умолчанию), в противном случае отправленные им обратные вызовы не будут обработаны. Пожалуйста, смотрите Следующее предупреждение, как только я попытался инициализировать Zoosh SDK в фоновом потоке:

ОБРАТИТЕ внимание, диспетчер местоположений (0x11b5c9d0) был создан в очереди отправки, выполняемой в потоке, отличном от основного потока. Разработчик несет ответственность за то, чтобы в потоке, в котором выделен объект диспетчера местоположений, выполнялся цикл выполнения. В частности, создание диспетчеров местоположений в произвольных очередях отправки (не присоединенных к основной очереди) не поддерживается и приведет к тому, что обратные вызовы не будут получены.

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