Możesz sprawdzić, czy robisz coś w głównym wątku, czy nie, przed wykonaniem aktualizacji interfejsu użytkownika. Pisałem sobie następujące makra:
/// 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!")
bywam grupie mojego kodu w metodach, gdzie metoda A wykonuje pewne przetwarzanie, a następnie wywołuje metodę B, który robi aktualizacje interfejsu użytkownika. Na początku metody B przyklejam makro BLOCK_UI(), które będzie twierdzić, jeśli nie jest uruchamiane w interfejsie użytkownika. Ponadto w przypadku długich zadań używam innego makra. Umieściłem te makra i bardziej losowe rzeczy na https://github.com/gradha/ELHASO-iOS-snippets, które mogą okazać się przydatne.
Te makra wymagają niestety dyscypliny w ich używaniu. Bardziej uciążliwym sposobem radzenia sobie z takimi sytuacjami może być owinięcie wszystkich obiektów interfejsu SDK za pośrednictwem serwera proxy (może podczas uruchamiania?), Które zapewniało, że nie były używane w głównym wątku. Te proxy/swizzling miałyby miejsce tylko w kompilacjach debugowania lub środowisku symulatora, aby uniknąć gwałtownych zmian. Rozważałem zrobienie tego ... ale wygląda na to, że ból jest właściwy.