Как использовать многопоточность в Swift 4 - PullRequest
1 голос
/ 16 января 2020

Я пытаюсь создать свой собственный аудиоплеер, используя ios CoreAudio framework в swift. Требуется как минимум два потока. Один поток декодирует аудиофайл, а другой поток предоставляет аппаратно декодированные данные. На самом деле второй поток, который передается аппаратному обеспечению, был обратным вызовом из ОС, поэтому мне все равно, что мне нужно просто передать необходимые данные при вызове функции обратного вызова.

КАК ЕСТЬ

Я использовал DispatchQueue для декодирования, на самом деле он работает хорошо. как показано ниже:

DispatchQueue.global(qos: .background).async {
    while(endOfFile) {
        // do decoding
        let res = ExtAudioFileRead(input, &frameCount,&convertedData)
    }
}

Проблема

Когда я использовал DispatchQueue, загрузка процессора превысила 100%. Телефон нагрелся, хотя я проигрывал только один mp3 musi c в моем плеере. Я не знаю, что было не так.

Вопросы

  1. Есть ли неправильный способ использования DispatchQueue?
  2. Есть ли способ использовать другой, кроме DispatchQueue?

1 Ответ

1 голос
/ 16 января 2020

Это не очень хорошая практика. Никогда не используйте циклы для ожидания чего-либо, ваша некоторая операция должна уведомлять о ее завершении и использовать обработчик завершения. Этот шаблон обычно называется занятым ожиданием , и это отличный способ быстро разрядить аккумулятор вашего устройства.

Вы должны использовать Обработчик завершения для достижения такого рода вещей.

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

Для получения более подробной информации следуйте Документации Apple .

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