Подтвердить что ты не робот

Помощь в многопоточности на iOS?

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

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

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

4b9b3361

Ответ 1

Concurrency Руководство по программированию от 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) будет выполняться на некотором фоновом потоке, а theres нет catch, о котором я знаю, т.е. theres уже пул автозапуска в этом потоке, вам не нужно заботиться о циклах запуска и т.д. После завершения задачи код вызывает -longTaskDidFinish в основном потоке (2), чтобы вы могли обновлять интерфейс или что-то еще. Это часто используемая идиома.

Ответ 2

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

Ответ 3

Swift 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 (самый низкий приоритет - минуты/часы, чтобы сэкономить)