На самом деле, это ложный положительный результат в инструменте проверки основных нитей Apple. Позвольте мне объяснить:
Проверка основного потока работает при запуске приложения, динамически заменяет реализации методов, которые должны вызываться только в основном потоке, с версией, которая предшествует проверке. Методы, о которых известно, что они безопасны для использования в фоновых потоках, исключаются из этой проверки.
Метод, вызываемый из фоновых потоков, - [UIApplication userInterfaceLayoutDirection]. Приложения GeneXus используют подкласс UIApplication (GXUIApplication), который переопределяет этот метод (userInterfaceLayoutDirection), чтобы поддерживать функцию SetLanguage языков справа налево на настроенных устройствах слева направо во время выполнения (или наоборот). Внутри этого переопределения вызывается [super userInterfaceLayoutDirection], и именно здесь Main Thread Checker выдает предупреждение.
Этот метод вызывается внутренне в фоновом режиме из реализаций фреймворков Apple, как вы можете видеть в опубликованной вами Backtrace, все, кроме самого метода userInterfaceLayoutDirection GXUIApplication, не является кодом GeneXus.
Проблема заключается в том, что Main Thread Checker вызывает предупреждение о вызове [UIApplication userInterfaceLayoutDirection] только тогда, когда вызов является явным, и игнорируется, когда он вызывается из другой среды Apple. В этом случае он считается явным, потому что метод перезаписывается в подклассе, даже если он вызывается внутренне из другой среды Apple.
Это можно проверить, заменив в исходном файле main.m в строке:
return UIApplicationMain(argc, argv, NSStringFromClass([GXUIApplication class]), NSStringFromClass([GXAppDelegate class]));
с:
return UIApplicationMain(argc, argv, NSStringFromClass([UIApplication class]), NSStringFromClass([GXAppDelegate class]));
С этим изменением (без использования подкласса с переопределением) средство проверки основного потока не будет выдавать предупреждение, даже если тот же метод все еще используется вызывается из фонового потока.
Мы будем искать обходной путь для этой проблемы Main Thread Checker в будущих обновлениях GeneXus (спасибо за отчет), а также уведомлять Apple о проблеме с Main Thread Checker. Между тем, вы можете отключить проверку основного потока из Xcode:
Scheme -> Edit Scheme...">
Diagnostics -> Main Thread Checker">
Также вы не беспокойтесь о том, что это является проблемой для ваших пользователей, так как Main Thread Checker активен только тогда, когда приложение запускается из XCode (с включенной диагностикой Main Thread Checker c).