Что делать в отдельной ветке? - PullRequest
2 голосов
/ 24 октября 2010

Итак, я прочитал кое-что о многопоточности и NSOperation и удивляюсь, как я могу использовать это для улучшения своего приложения. Используя инструменты, я выделил несколько мест, где мое приложение могло бы использовать улучшение скорости. У меня такой вопрос, подходят ли такие вещи для другого потока, использующего NSOperation?

Рисование вида: У меня довольно сложный вид, на рисование которого уходит немного времени. Когда он нарисован, я испытываю некоторое отставание.

Распределение и воспроизведение аудио: Я использую AVAudioPlayer для воспроизведения фоновой музыки. Когда я его выделю, снова какое-то отставание.

Вычисления: Я также выполняю некоторые вычисления и сравниваю их с множеством целых чисел.

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

Ответы [ 3 ]

5 голосов
/ 24 октября 2010

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

Аудиокод может быть фоновым, но не должен быть таким дорогим

Расчеты, безусловно, могут быть обоснованы без забот.

4 голосов
/ 25 октября 2010

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

Самые большие вещи, которые я считаю хорошими для фоновых потоков, часто связаны с асинхронными операциями.(Подумайте о веб-странице AJAX).Если вы хотите, чтобы ваш пользователь мог взаимодействовать с пользовательским интерфейсом , пока что-то происходит.Хорошим примером будет получение, обновление, получение любых данных из Интернета.

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

Даже если вы захотите заблокировать ваше приложение при чтении такого синхронного фрагмента данных изв Интернете, вы все равно можете сделать это асинхронно - чтобы вы могли загружать данные в фоновом потоке - пока вы предоставляете индикатор выполнения, элемент управления счетчиком (прогресс) или позволяете пользователю нажать «Отмена».Кнопка "в foreground потоке пользовательского интерфейса.

Думайте об" асинхронных "запросах как о тех, которые будут занимать более длительный период времени или в которых вы не можете определить сколько времени это займет.

3 голосов
/ 25 октября 2010

Некоторые методы рисования пользовательского интерфейса были сделаны потокобезопасными с iOS 4.0:

источник: Apple dev: Что нового в iOS: iOS 4.0

Рисование вграфический контекст в UIKit теперь потокобезопасен.В частности:

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

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

  • Загрузка вещей из Интернета
  • Дорогие запросы (чтение / запись) в базу данных
  • Долгосрочные алгоритмы

Если вы решите справиться с некоторыми задачамиЯ бы порекомендовал использовать NSOperation и NSOperationQueue, так как они сильно упрощают вещи.Немного обучения, но оно того стоит!

Удачи!

...