Помогите с многопоточностью на iOS? - PullRequest
25 голосов
/ 05 декабря 2010

У меня есть приложение, которое использует OpenEars и библиотеку Flite.Проблема в том, что библиотека Flite ресурсоемка и замораживает мое приложение.Я подозреваю, что запуск Flite в фоновом потоке исправит ситуацию, но у меня есть нет идеи, как это сделать.

Тем не менее, как мне реализовать фоновый поток в iOS ?

Буду признателен, если кто-нибудь сможет указать мне некоторые учебникиподелитесь примером кода или общими советами, которые помогут мне решить эту проблему.

Ответы [ 3 ]

45 голосов
/ 05 декабря 2010

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


Пересматривая ответ через некоторое время, в настоящее время вы почти не ошибетесь с помощью Grand Central Dispatch. Запуск задачи в фоновом режиме выглядит следующим образом:

dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    [self doSomeLongTask]; // 1
    dispatch_async(dispatch_get_main_queue(), ^{
        [self longTaskDidFinish]; // 2
    });
});

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

6 голосов
/ 03 марта 2012

Может быть, лучше всего этот урок от Apple .Я внимательно прочитал (10-20 минут) и «нарезал» все мои заявки!Отлично!

1 голос
/ 16 марта 2017

Свифт 3

DispatchQueue.global(qos: .userInteractive).async {
    // Code to run on background thread

    // Switch to the main UI thread to display any results needed
    DispatchQueue.main.async {
        // Run code on main UI thread here
    }
}

Параметр qos означает «Качество обслуживания». Думайте об этом как о приоритете, чтобы придать фоновой нити:

  • .userInteractive (высший приоритет)
  • .userInitiated (когда вы можете сэкономить несколько секунд)
  • .utility (когда вы можете сэкономить от нескольких секунд до нескольких минут)
  • .background (самый низкий приоритет - минуты / часы)
...