Вы должны профилировать свое приложение с помощью инструментов. Time Profiler (обязательно использовать опцию «Ожидаемые записи») может быть полезен, как и System Trace. Для обоих вы можете использовать «Стратегия стратегии», , фокусируясь на основном потоке. Есть несколько видеороликов WWDC, в которых описываются различные подходы, в том числе датированное, но все же актуальное, видео 2012 года Building Concurrent User Interfaces on iOS. Также смотрите новые видеоролики WWDC, которые ссылаются на «профилирование» и «инструменты».
Что касается несущественных потоков, отрицательно влияющих на производительность, то это в целом незначительно, и у вас, вероятно, есть что-то еще. Единственный раз, когда это серьезная проблема, вы используете очень старое устройство, которое не поддерживает многопоточность.
Кстати, вы на 100% уверены, что основная тема действительно не реагирует? Или возможно, что вы просто не видите обновления пользовательского интерфейса, которые отражаются своевременно? Это может быть результатом случайного выполнения обновлений пользовательского интерфейса из фонового потока, а не отправки их обратно в основную очередь.
Если вы хотите получить более конкретный совет, нам нужна проблема reproducible example. Но в аннотациях,
- убедитесь, что у вас нет времени на выполнение операций в основной очереди;
- убедитесь, что все обновления пользовательского интерфейса отправлены обратно в основную очередь ... это включает что-нибудь, которое может инициировать обновление элемента управления UIKit;
- убедитесь, что ваш код не «ждет» чего-либо из основного потока (например, ожидает семафор, ждет операций в очереди операций, ждет группы отправки и т. Д.); и
- помните, что не все асинхронные API будут называть их обработчиками завершения в фоновых очередях (на самом деле многие отправляют его обратно в основную очередь для удобства использования), поэтому, если вы делаете что-то много времени в завершите обработчик, убедитесь, что он фактически запускается в фоновом потоке или нет.
FYI - 'dispatch_async' не гарантирует фоновая очередь. Он использует любую очередь, в которую вы проходите. Обновите свой вопрос с помощью соответствующего кода. – rmaddy
@rmaddy - Вы правы, конечно. Нам нужно больше, чтобы продолжать. Но в его защиту он сказал, что отправил «не основную нить» [sic]. – Rob
@Rob OP не говорит, что «он» отправлял «не основной поток». OP указывает, что 'dispatch_async' отправляет« не основной поток ». Отсюда мой оригинальный комментарий. – rmaddy