2016-09-07 3 views
1

Я нашел странное поведение на iOS7. У меня есть dispatch_async фоновый поток, который обрабатывает большую нагрузку, и из этой темы я хочу обновить интерфейс. Так что я сделал именно так:dispatch_async (dispatch_get_main_queue(),^{}); from Background Thread slow on iOS7

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{ 

    [self heavyFunction]; 

    dispatch_async(dispatch_get_main_queue(), ^{ 

     [self updateUI]; 

    }); 
}); 

КСН 8 и выше приведенный выше код работает, как это предлагается, но работает на устройстве iOS7 Test (iPhone 4s) вызов dispatch_async(dispatch_get_main_queue(), ^{}); занимает 4 секунды каждый. Я allready взял обновление и тяжелую функцию, и такое же поведение все еще появляется. Затем я создал минимальный пример, в котором он не появляется. Поэтому я подумал, что, возможно, что-то еще блокирует мой main_queue на iOS7, но я не могу понять, что это должно быть. На этом ViewController нет другого материала, связанного с пользовательским интерфейсом, пока не закончится [self heavyfunction];.

Все скомпилировано с XCode 7.3.1 с базовым SDK 9.3 и целью развертывания 7.0.

Кто-нибудь уже имел это поведение и мог указать мне направление, которое может блокироваться здесь?

+1

Используете ли вы прибор времени профайлера? – Paulw11

+0

Да, у меня есть, но я просто получаю '[UIView (Hierachy) layoutBelowIfNeeded]' в цикле в течение 2 секунд в два раза. –

+0

Вы получаете предупреждения о конфликтующих ограничениях? – Paulw11

ответ

0

Итак, после некоторых исследований я нашел проблему. Я вызываю фоновый поток с уведомлением (поверх NSNotificationCenter) из моего бэкэнд, и это уведомление получает от двух разных ViewControllers для обновления источников данных для UITableViews. Вторая (одна с зависанием) находится в иерархии NavigationController под первой.

Оба уведомления обрабатываются одинаково, а пользовательский интерфейс перезагружается на обоих контроллерах, даже если первый не отображается вообще. Но это просто похоже на iOS 7. Все вышеперечисленные версии iOS просто не перезагружают пользовательский интерфейс из невидимого ViewController.

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

Что по-прежнему беспокоит меня, так это то, что все версии iOS выше iOS 7, похоже, автоматически обрабатывают эту проблему, но iOS 7 этого не делает.

Смежные вопросы