Как воспроизвести звук после успешного выполнения каждого сетевого запроса? - PullRequest
0 голосов
/ 30 июня 2019

Я хочу воспроизводить звук после успешного выполнения каждого сетевого запроса. У меня есть несколько объектов, которые я хочу отправить на сервер, используя цикл for. В каждой итерации я отправляю запрос на сервер и после того, как каждый запрос завершен, я хочу воспроизвести звук.

Я пробовал это:

for object in objects {
   sendObjectToServer(object)
}

func playSound() {
  let url = Bundle.main.url(forResource: "sound", withExtension: "mp3")!
  let player = try! AVAudioPlayer(url)
  player.play()
}

func sendObjectToServer(object: Object) {
   URLSession.shared.dataTask(with url: object.url) {(data,response,error) in
     DispatchQueue.main.async {
          playSound() // doesn't play sound synchronously
        }  
    }
 }

1 Ответ

0 голосов
/ 30 июня 2019

Почему вы используете основной поток для фоновых операций.Обновляйте свой пользовательский интерфейс только с кодом Dispatch.main.async:

Попробуйте это на физическом устройстве (проверено и работает)

import AVFoundation

for object in objects {
   DispatchQueue.global(qos: .background).async {
     sendObjectToServer(object)
   }
}


var player: AVAudioPlayer?

func playSound() {
    guard let url = Bundle.main.url(forResource: "sound", withExtension: "mp3") else { return }

    do {
        try AVAudioSession.sharedInstance().setCategory(.playback, mode: .default)            
        try AVAudioSession.sharedInstance().setActive(true)

        /* The following line is required for the player to work on iOS 11. Change the file type accordingly*/
        player = try AVAudioPlayer(contentsOf: url, fileTypeHint: AVFileType.mp3.rawValue)

        /* iOS 10 and earlier require the following line:
        player = try AVAudioPlayer(contentsOf: url, fileTypeHint: AVFileTypeMPEGLayer3) */

        guard let player = player else { return }

        player.play()

    } catch let error {
        print(error.localizedDescription)
    }
}

func sendObjectToServer(object: Object) {
   URLSession.shared.dataTask(with url: object.url) {(data,response,error) in
      // Custom Logic
      playSound()
    }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...