Вы можете сами проверить, выполняете ли вы какие-либо действия в основном потоке или нет, прежде чем выполнять обновления своего пользовательского интерфейса.Я написал себе следующие макросы:
/// Stick this in code you want to assert if run on the main UI thread.
#define DONT_BLOCK_UI() \
NSAssert(![NSThread isMainThread], @"Don't block the UI thread please!")
/// Stick this in code you want to assert if run on a background thread.
#define BLOCK_UI() \
NSAssert([NSThread isMainThread], @"You aren't running in the UI thread!")
Я склонен группировать свой код в методах, где метод A выполняет некоторую обработку, а затем вызывает метод B, который обновляет пользовательский интерфейс.В начале метода BI вставьте макрос BLOCK_UI (), который будет утверждать, если он не запускается в пользовательском интерфейсе.Также для длительных задач я использую другой макрос.Я поместил эти макросы и другие случайные вещи в https://github.com/gradha/ELHASO-iOS-snippets, которые вы можете найти полезными.
Эти макросы, к сожалению, требуют дисциплины в их использовании.Более навязчивый способ справиться с такими ситуациями может заключаться в том, чтобы обернуть все объекты интерфейса SDK через прокси (возможно, при запуске?), Который утверждал, что они использовались не в основном потоке.Эти прокси / swizzling будут происходить только в отладочных сборках или в среде симулятора, чтобы избежать свертывания реальных выпусков.Я подумал об этом ... но похоже, что делать правильно - это просто боль.