2016-08-09 3 views
2

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

dispatch_async 

Это рассылает неосновного потока. Я также проверил с журналами, что они работают. Каждая функция по трубопроводу отключена от основного потока. И все же я испытываю зависание UI.

Вопросы:

  1. Какой самый лучший способ, чтобы выяснить, что в основном потоке, и что он делает/ждёте?
  2. Возможно ли, чтобы основные потоки делали так, что это фактически воздействует на основной поток?
+0

FYI - 'dispatch_async' не гарантирует фоновая очередь. Он использует любую очередь, в которую вы проходите. Обновите свой вопрос с помощью соответствующего кода. – rmaddy

+0

@rmaddy - Вы правы, конечно. Нам нужно больше, чтобы продолжать. Но в его защиту он сказал, что отправил «не основную нить» [sic]. – Rob

+0

@Rob OP не говорит, что «он» отправлял «не основной поток». OP указывает, что 'dispatch_async' отправляет« не основной поток ». Отсюда мой оригинальный комментарий. – rmaddy

ответ

0

Я хотел бы использовать эти инструменты для этого есть куча инструментов там вы можете использовать, например, Time Profiler, распределения, системы Использование и т.д. Для того, чтобы открыть инструменты использовать команду + я в Xcode или Xcode> Open Developer Инструменты> Инструменты в меню xcode.

+0

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

+0

не могли бы вы дать больше контекста для «этого» пользовательского интерфейса? –

4

Вы должны профилировать свое приложение с помощью инструментов. Time Profiler (обязательно использовать опцию «Ожидаемые записи») может быть полезен, как и System Trace. Для обоих вы можете использовать «Стратегия стратегии», enter image description here, фокусируясь на основном потоке. Есть несколько видеороликов WWDC, в которых описываются различные подходы, в том числе датированное, но все же актуальное, видео 2012 года Building Concurrent User Interfaces on iOS. Также смотрите новые видеоролики WWDC, которые ссылаются на «профилирование» и «инструменты».

Что касается несущественных потоков, отрицательно влияющих на производительность, то это в целом незначительно, и у вас, вероятно, есть что-то еще. Единственный раз, когда это серьезная проблема, вы используете очень старое устройство, которое не поддерживает многопоточность.

Кстати, вы на 100% уверены, что основная тема действительно не реагирует? Или возможно, что вы просто не видите обновления пользовательского интерфейса, которые отражаются своевременно? Это может быть результатом случайного выполнения обновлений пользовательского интерфейса из фонового потока, а не отправки их обратно в основную очередь.

Если вы хотите получить более конкретный совет, нам нужна проблема reproducible example. Но в аннотациях,

  • убедитесь, что у вас нет времени на выполнение операций в основной очереди;
  • убедитесь, что все обновления пользовательского интерфейса отправлены обратно в основную очередь ... это включает что-нибудь, которое может инициировать обновление элемента управления UIKit;
  • убедитесь, что ваш код не «ждет» чего-либо из основного потока (например, ожидает семафор, ждет операций в очереди операций, ждет группы отправки и т. Д.); и
  • помните, что не все асинхронные API будут называть их обработчиками завершения в фоновых очередях (на самом деле многие отправляют его обратно в основную очередь для удобства использования), поэтому, если вы делаете что-то много времени в завершите обработчик, убедитесь, что он фактически запускается в фоновом потоке или нет.
Смежные вопросы