#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 из-за слишком большого количества необработанных сообщений» не происходит.