Подтвердить что ты не робот

Обнаружение действий пользовательского интерфейса вне основного потока

Примечание. Этот вопрос связан с Предупреждать о вызовах UIKit из фоновых потоков, но не дает ответа на два из нижеприведенных подходов.

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

Поэтому я поставил следующий код во многих местах:

assertMainThread();

который:

#define assertMainThread() NSAssert([NSThread isMainThread],@"Method called using a thread other than main!")

Конечно, я не могу покрыть весь код с помощью assertMainThread(), так как есть много мест, и некоторый код используется законным способом с помощью фоновых очередей GCD.

Я просмотрел много мест, но не смог найти способ XCode или LLDB рассказать мне, когда элемент пользовательского интерфейса обновляется вне основного потока. Я думал, что можно использовать символические точки останова или какой-то другой механизм, чтобы сломаться там, где общий метод в UIKit вызывается вне основного потока, например, но не смог найти способ.

Я также думал, что UIKit может предупредить во время выполнения, когда такой вызов сделан? Или, по крайней мере, дать нам некоторые инструменты, чтобы помочь справиться с такими проблемами.

Другой подход, который я смотрел (но не пытался), - это использовать некоторые методы покрытия кода и попытаться извлечь, какой поток был запущен в какой точке кода визуально, но не пошел по этому маршруту.

Есть ли у вас какая-либо идея о том, как решить эту проблему?

4b9b3361

Ответ 1

Xcode 9 и более поздние версии

Xcode 9 представляет Main thread checker, который обнюхивает многие важные проблемы, потенциально выполняемые вне основного потока. Вы можете включить этот анализатор обычным способом в параметрах Scheme вместе с другими анализаторами времени выполнения.

Xcode 8.3 и ранее

Альтернативное решение Xcode-way на основе steipete gist - символическая точка останова:

Символьная точка останова Xcode

Вы можете легко добавить точки останова для некоторых других методов в любой класс UIKit, например -[UIView setNeedsDisplay] и т.д.

Ответ 2

Начиная с Xcode 9 Apple интегрировала Main Thread Checker в Xcode, который включен по умолчанию, если вы запустили приложение с помощью отладчика Xcode.

Его можно отключить/включить в конфигурации схемы на вкладке диагностики.