Как избежать зависаний пользовательского интерфейса? - PullRequest
1 голос
/ 21 ноября 2010

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

  1. У меня есть кнопка, которая при нажатии загружает локальный mp3-файл (около 20-30 МБ) с помощью AVAudioPlayer, вызываетprepareToPlay, а затем воспроизводит аудиофайл.Проблема заключается в том, что кнопка показывает, что флаг showsTouchWhenHighlighted установлен на да, и после нажатия на нее он остается выделенным, пока не начнет воспроизводиться аудиофайл, что может занять 1-3 секунды.

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

Может кто-нибудь предложить хороший подход к минимизации / устранению этих мини-блокировок?Я действительно не сталкивался с каким-либо кодом для достижения этой цели ни в одной из прочитанных мною книг / руководств, посвященных просмотрам таблиц и avaudioplayer.Должен ли я запускать эти действия в разных потоках?

thx

Ответы [ 2 ]

2 голосов
/ 21 ноября 2010

Для номера 1 лучше всего загрузить элемент в фоновом потоке и сообщить пользователю, что вы делаете это (либо через загрузочный HUD, либо с помощью другого индикатора). Простейшим способом сделать это будет использование - (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg;. Если вы работаете с iOS 4.0 +, вы можете посмотреть, как выполняются обратные вызовы блоков, и посмотреть, будут ли они работать для вас.

Для номера 2 выполните сортировку в фоновом потоке или измените метод сортировки (рассмотрите возможность использования отсортированной структуры данных вместо использования после вставок?). reloadData должен происходить только в основном потоке.

1 голос
/ 21 ноября 2010

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

Хотя я этого не делаюполучить четкий ответ, ищите асинхронные опции для выполнения этих действий, поскольку они не блокируют ваш пользовательский интерфейс.Обычно это достигается с помощью потоков или отложенных объектов.Исходя из моего опыта с Objective-C, большинство действий, которые необходимо выполнить вашей программе, может быть достигнуто с помощью асинхронных действий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...