iOS: как отладить задержку пользовательского интерфейса [двухъядерный iPad2]

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

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

Итак, вот что я пытался сделать, чтобы поток пользовательского интерфейса был свободен:

  • Глобальная оптимизация для удаления очень медленного кода, независимо от того, в каком потоке он находится.
  • Понизить приоритеты всех потоков, т.е.

     NSOperation.threadPriority=0,1;
    NSThread.threadPriority=0,1;
    dispatch_async (dispatch_get_global_queue (PRIORITY_LOW));
     

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

Ошибка выглядит следующим образом: когда я довольно быстро прокручиваю таблицу, она внезапно зависает примерно на 0,1 с, а затем продолжает работать так же гладко, как обычно. Во время зависания я вижу в инструментах скачок процессора. Но в представлении отдельного потока я вижу, что основной поток в порядке и почти не потребляет ресурсы ЦП.

  1. Так почему же таблица пользовательского интерфейса все еще зависает?
  2. И почему фоновые потоки все еще занимает так много циклов процессора с такими низкими приоритетами потоков?
  3. Ребята, как вы обеспечиваете постоянную отзывчивость пользовательского интерфейса?
  4. Существуют ли какие-либо полезные инструменты для выделения областей, вызывающих зависание пользовательского интерфейса?
5
задан Jay Zhao 9 March 2012 в 12:23
поделиться