2016-12-19 2 views
-1

Я почти закончил перенос приложения моей iOS в Swift 3.0. Но у меня все еще есть несколько случаев, подобных приведенным ниже. Большинство из них я смог решить, поставив проблематичный код в основной поток.приложение, изменяющее механизм автозапуска из фоновой темы

В некоторых других случаях я не могу понять, какая часть моего кода выполняется в неправильном потоке. И я получаю сообщение, как это:

This application is modifying the autolayout engine from a background thread after the engine was accessed from the main thread. This can lead to engine corruption and weird crashes. 
Stack:(
    0 CoreFoundation      0x000000018765a1d8 <redacted> + 148 
    1 libobjc.A.dylib      0x000000018609455c objc_exception_throw + 56 
    2 CoreFoundation      0x000000018765a108 <redacted> + 0 
    3 Foundation       0x0000000188241ea4 <redacted> + 192 
    .................... 
    16 libsystem_pthread.dylib    0x00000001866eece4 <redacted> + 200 
    17 libsystem_pthread.dylib    0x00000001866ee378 pthread_mutex_lock + 0 
    18 libsystem_pthread.dylib    0x00000001866edda4 start_wqthread + 4 
) 

Есть ли какая-то особая техника (опция при использовании отладчика или ??) я могу использовать, чтобы проследить путь, за которой следует progran, чтобы увидеть, где это происходит?

+0

Посмотрите на это: http://stackoverflow.com/a/39712843/1208191 –

ответ

1

Я не думаю, что есть какой-либо другой встроенный инструмент для отладки таких сбоев, потому что это код, который изменяет элементы/ограничения пользовательского интерфейса AutoLayout из кода, который либо работает в фоновом потоке, либо обработчиках завершения. Все обработчики завершения по умолчанию запускаются в фоновом потоке. Вам нужно использовать GCD для обновления элементов пользовательского интерфейса из блоков обработчика завершения.

+0

Что вы называете «НОД» в этом контексте? Может быть, вопрос новичков? – Michel

+0

Это обычная почта (отправка товара). используйте Main of Dispatch Queue Main. –

+0

ОК. Я решил это, начиная с того, что оставил основной протектор, единственное, что я оставил на ветке BG, и убираю. – Michel

5

Очевидно, что вы делаете обновление пользовательского интерфейса на задней земле. Не могу предсказать, где именно, не видя свой код.

Вот некоторые ситуации, это может произойти: -

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

    DispatchQueue.main.async { // do UI update here } 
    
  2. заход в func делает вызов запроса веба на фоновом потоке и его обработчик завершения вызова другого func делает ще обновление.

Чтобы решить эту проблему, проверьте код, в котором вы обновили пользовательский интерфейс после вызова веб-запроса.

// Do something on background thread 
DispatchQueue.global(qos: .userInitiated).async { 
    // update UI on main thread 
    DispatchQueue.main.async { 
       // Updating whole table view 
       self.myTableview.reloadData() 
      } 
} 
Смежные вопросы