Помощь в многопоточности на iOS?
У меня есть приложение, которое использует OpenEars и библиотеку Flite. Проблема в том, что библиотека Flite ресурсоемкая и затормозила мое приложение. Я подозреваю, что запуск Flite на фоновом потоке поможет исправить ситуацию, но я понятия не имею, как это сделать.
Тем не менее, как реализовать фоновый поток в iOS?
Я был бы признателен, если бы кто-нибудь мог указать мне на некоторые уроки, поделиться некоторым примером кода или любым общим советом, который поможет мне решить эту проблему.
Ответы
Ответ 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
(самый низкий приоритет - минуты/часы, чтобы сэкономить)