Приложение для iPad перестает правильно отвечать на события интерфейса - PullRequest
0 голосов
/ 21 декабря 2011

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

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

Если кто-нибудь может дать мне какой-либо совет, я буду очень признателен.

Обс .: Есть еще одна вещь, которая мне любопытна: в моем приложении, когда у меня возникает эта проблема, анимация uiview перестает происходить. Но анимация CALayer выполняется нормально. Есть ли объяснение этому?

Ответы [ 3 ]

1 голос
/ 21 декабря 2011

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

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

.посмотрите на Руководство по программированию параллелизма Apple .

Apple рассматривает NSThreads ...

* ... отойти от потоков может быть невозможно во всех случаях, производительность (и простота вашего кода) может значительно улучшиться в тех местах, где вы делаете переключение.В частности, использование очередей диспетчеризации и очередей операций вместо потоков имеет несколько преимуществ:

  • Это уменьшает потери памяти, которые ваше приложение платит за хранение стеков потоков в области памяти приложения.
  • Устранен код, необходимый для создания и настройки потоков.
  • Устранен код, необходимый для управления и планирования работы над потоками.
  • Упрощает код, который нужно написать.

Также см. этот вопрос в NSThread против NSOperationQueue.

0 голосов
/ 22 декабря 2011

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

Если вы хотите, чтобы анимация пользовательского интерфейса была плавной, ваше приложение должно часто возвращаться из всей обработки основного потока в цикл выполнения пользовательского интерфейса (может быть, по крайней мере, 30 раз в секунду?).

0 голосов
/ 21 декабря 2011

Вы, вероятно, блокируете основной поток, делая что-то длительное.Вы опрашиваете или зацикливаетесь где-то в своем коде?Если вы делаете (что не следует делать), убедитесь, что вы делаете это в фоновом потоке.

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