Средство проверки основного потока: API пользовательского интерфейса, вызываемый в фоновом потоке: -[Делегат UIApplication]

Xcode 9, похоже, сообщает о большом количестве вызовов основного потока к свойствам UIApplication. Несмотря на то, что пользовательский интерфейс не обновляется, это особенно громоздко из-за расширения журналов, которое создает среду по умолчанию.

4   TestApp                             0x0000000101c262e0 __39-[ViewController viewDidLoad]_block_invoke + 196
5   libdispatch.dylib                   0x0000000102279654 _dispatch_call_block_and_release + 24
6   libdispatch.dylib                   0x0000000102279614 _dispatch_client_callout + 16
7   libdispatch.dylib                   0x0000000102289008 _dispatch_queue_serial_drain + 716
8   libdispatch.dylib                   0x000000010227ce58 _dispatch_queue_invoke + 340
9   libdispatch.dylib                   0x000000010228a1c4 _dispatch_root_queue_drain_deferred_wlh + 412
10  libdispatch.dylib                   0x00000001022917fc _dispatch_workloop_worker_thread + 868
11  libsystem_pthread.dylib             0x00000001ac6771e8 _pthread_wqthread + 924
12  libsystem_pthread.dylib             0x00000001ac676e40 start_wqthread + 4

person iPC    schedule 13.06.2017    source источник
comment
Вы пропустили верхнюю часть этой трассировки стека, которая сообщила бы нам, в каком потоке это выполняется. Могу поспорить, что это не был основной поток. Например, если вы инициируете переход из фонового потока (например, закрытие завершения URLSession), viewDidLoad также не будет в основном потоке. Вам нужно вернуться назад, чтобы увидеть, где был инициирован переход, и подтвердить, что он находится в основном потоке. Или, если вы действительно получаете это, когда это выполняется в основном потоке, нам нужно увидеть наименьший объем кода, который позволяет нам воспроизвести сообщения журнала.   -  person Rob    schedule 13.06.2017


Ответы (2)


Если эти отчеты сбивают вас с толку, снимите с них галочки:

  1. Редактировать схему...введите здесь описание изображения
  2. Снимите флажок «Проверка основного потока» в меню «Выполнить» > «Диагностика» введите здесь описание изображения
person CGN    schedule 15.08.2017
comment
Хорошо иметь эти журналы, а не отключать этот журнал ...! так что вы осознаете, и вы решите это. - person Mubin Mall; 31.08.2017
comment
В Xcode 9.3 мне нужно сделать это для фазы тестирования, а не для фазы выполнения, как показано выше. - person Intel; 11.04.2018

Проверьте также шаблон ARKit, проект Xcode, журнал Main Thread Checker консоль.

Если метод UIApplication или UIApplicationDelegate вызывается из другого потока, вы можете отключить проверку потока, как в ответе CGN, но это полностью отключит эту проверку. Вы также можете подклассировать то, что необходимо, и вызвать метод суперкласса в основном потоке. Таким образом, вы все еще можете использовать Main Thread Sanitizer в других местах кода.

person Adam Tucholski    schedule 30.07.2019