2015-09-08 2 views
0

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

Но я попытался использовать оба способа, но пока не столкнулся с какими-либо проблемами. Возможно, мои сценарии были достаточно простыми, проблемы возникали только в сложном коде, но мне интересно узнать этот вопрос глубже. И попытайтесь найти ситуацию, когда пренебрежение этим правилом дает 100% -ный аборт программы или некоторые другие серьезные проблемы (взаимоблокировки, условия гонки и т. Д.).

Возможно, некоторые из вас столкнулись с этим «врагом» или помнят точные примеры в вашей практике. Был бы очень благодарен за возможные иллюстрации кода (или псевдокода).

Благодаря

+0

Попробуйте запустить анимацию в фоновом потоке для Exemple :) – KIDdAe

+0

Я знаю о анимации, что это должно быть сделано только в основном потоке, но, например, в сценарии RESTful, если запрос отправки в фоновом режиме, чем выборка данных и вызов экземпляра 'reloadData' в' UITableView', все будет в порядке. – David

ответ

1

Вся UIKit раньше резьб небезопасным, так что вызов почти ничего из фонового потока, используемого врезаться, почти всегда. Теперь ситуация намного лучше, но с GCD, все равно, просто обновить пользовательский интерфейс в основном потоке. Текущий шаблон выглядит примерно так:

[someWorker runBackgroundOperationAndCall:^{ 
    dispatch_async(dispatch_get_main_queue(), ^{ 
     // update UI 
    }); 
}]; 

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

(А жаль, я не короткий фрагмент кода, который продемонстрирует бы то пойдет не так при обновлении пользовательского интерфейса из фонового потока.)

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