На Cocoa Touch / UIKit, как обнаружить изменения в пользовательском интерфейсе из фонового потока? - PullRequest
5 голосов
/ 11 октября 2011

В Cocoa Touch, если мы обновляем элементы пользовательского интерфейса из фонового потока, происходят плохие вещи.

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

Есть ли способ заставить UIKit работать в педантичном режиме, чтобы, как только кто-то обновлял элемент из фонового потока, он падал или записывал что-то на консоль?

1 Ответ

2 голосов
/ 11 октября 2011

Вы можете сами проверить, выполняете ли вы какие-либо действия в основном потоке или нет, прежде чем выполнять обновления своего пользовательского интерфейса.Я написал себе следующие макросы:

/// 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 будут происходить только в отладочных сборках или в среде симулятора, чтобы избежать свертывания реальных выпусков.Я подумал об этом ... но похоже, что делать правильно - это просто боль.

...