Приложение для iPad синхронизируется с фидом XML и выполняет синхронизацию в подклассе NSOperation, выполняемом из NSOperationQueue. Когда он анализирует фид, он перезванивает в главный поток через performSelectorOnMainThread:withObject:waitUntilDone:
, чтобы обновить различные части пользовательского интерфейса, запланировать загрузку и т. Д. Некоторые из них довольно дороги; пользовательский интерфейс иногда может перестать отвечать на запросы в течение одной или двух секунд во время синхронизации.
Чтобы сделать пользовательский интерфейс более отзывчивым, я исключил использование performSelectorOnMainThread:withObject:waitUntilDone:
в пользу прямых вызовов для выполнения всех задач, связанных с синхронизацией, включая обновление пользовательского интерфейса. Так что теперь синхронизация происходит полностью в фоновом потоке, созданном NSOperationQueue. Кажется, это работает довольно хорошо, и пользовательский интерфейс намного быстрее реагирует на синхронизацию.
Однако я опасаюсь выпустить его таким образом. Я встречал некоторые упоминания в разных местах, что нужно обновлять интерфейс только в главном потоке (пример со ссылкой на AppKit ). Но я не смог найти ничего конкретного по этой теме в документации.
Итак, насколько важно обновить пользовательский интерфейс в главном потоке? Какие части приложения являются потокобезопасными, а какие нет? Возможно, есть ссылка, объясняющая, что безопасно выполнять в NSOperation и что должно выполняться только в основном потоке в iOS? Я действительно делаю что-то небезопасное или склонное к сбоям?