在我的应用程序中,我有2个UIButtons,每个按钮播放2种声音(播放一种声音,暂停,播放另一种声音),并且每次按下UIButtons图像都会更改,我的应用程序也有一些选项卡。问题是当我按下一个UIButton(播放和完成声音大约需要4秒钟),我无法按下另一个按钮,甚至无法在选项卡之间切换,该应用程序会冻结,直到完成UIbutton的操作,然后再按下其他按钮按钮或切换标签。 这是我的代码:

import UIKit
import AVFoundation
import CoreData


class FirstViewController: UIViewController {

var player:AVAudioPlayer = AVAudioPlayer()

var player2:AVAudioPlayer = AVAudioPlayer()


@IBAction func play(_ sender: Any) {

    player.play()
    sleep(1)
    player2.play()
}

@IBAction func play2(_ sender: Any) {
    player.play()
    sleep(1)
    player2.play()  
}


@IBOutlet weak var play: UIButton!
@IBOutlet weak var play2: UIButton!

var buttonActive = false

@IBAction func pPressed(_ sender: Any) {
    if buttonActive {
        play.setBackgroundImage(UIImage(named: "SwitchD-Icon-40"), for: .normal)
    } else {
        play.setBackgroundImage(UIImage(named: "Switch-Icon-40"), for: .normal)
    }
    buttonActive = !buttonActive
}

@IBAction func p2Pressed(_ sender: Any) {
    if buttonActive {
        play2.setBackgroundImage(UIImage(named: "SwitchD-Icon-40"), for: .normal)
    } else {
        play2.setBackgroundImage(UIImage(named: "Switch-Icon-40"), for: .normal)
    }
    buttonActive = !buttonActive
}

override func viewDidLoad() {
    super.viewDidLoad()
    play.setBackgroundImage(UIImage(named: "SwitchD-Icon-40"), for: .normal)
    play2.setBackgroundImage(UIImage(named: "SwitchD-Icon-40"), for: .normal)

do

    {

        let audioPath = Bundle.main.path(forResource: "DTMF-1", ofType: "mp3")
        try player = AVAudioPlayer(contentsOf: NSURL(fileURLWithPath: audioPath!) as URL)

        let audioPath2 = Bundle.main.path(forResource: "DTMF-2", ofType: "mp3")
        try player2 = AVAudioPlayer(contentsOf: NSURL(fileURLWithPath: audioPath2!) as URL)

 }

有什么方法可以使我的应用程序更快?

#1楼 票数:0 已采纳

实现做某事, 暂停和做另一件事的一种著名方法是使用Timer

以下代码还包括:

  • 如何正确实例化AVAudioPlayer
  • 如何使工作Timer无效
  • 即将重用时如何stop AVAudioPlayer
  • 如何在过渡时停止播放

请试试:

class FirstViewController: UIViewController {

    var player: AVAudioPlayer? //### You should not instantiate unused objects

    var player2: AVAudioPlayer?

    var secondSoundTimer: Timer?

    private func startPlaying() {
        stopPlaying()

        player?.play()
        //### Using `Timer` is one way to achieve pause-like thing.
        //### If you need to target older iOSs than 10.0, you need to modify this part.
        secondSoundTimer = Timer.scheduledTimer(withTimeInterval: 1.0, repeats: false) {timer in
            self.player2?.play()
            self.secondSoundTimer?.invalidate()
            self.secondSoundTimer = nil
        }
    }

    private func stopPlaying() {
        secondSoundTimer?.invalidate()
        secondSoundTimer = nil
        if let player = player, player.isPlaying {
            //### Stop playing (keeping internal `prepared` state) and rewind to the first place.
            player.pause()
            player.currentTime = 0
        }
        if let player2 = player2, player2.isPlaying {
            player2.pause()
            player2.currentTime = 0
        }
    }

    @IBOutlet weak var play: UIButton!
    @IBOutlet weak var play2: UIButton!

    var buttonActive = false

    @IBAction func pPressed(_ sender: Any) {
        startPlaying()
        if buttonActive {
            play.setBackgroundImage(UIImage(named: "SwitchD-Icon-40"), for: .normal)
        } else {
            play.setBackgroundImage(UIImage(named: "Switch-Icon-40"), for: .normal)
        }
        buttonActive = !buttonActive
    }

    //### Don't you need `button2Active`?

    @IBAction func p2Pressed(_ sender: Any) {
        startPlaying()
        if buttonActive {
            play2.setBackgroundImage(UIImage(named: "SwitchD-Icon-40"), for: .normal)
        } else {
            play2.setBackgroundImage(UIImage(named: "Switch-Icon-40"), for: .normal)
        }
        buttonActive = !buttonActive
    }

    override func viewDidLoad() {
        super.viewDidLoad()
        play.setBackgroundImage(UIImage(named: "SwitchD-Icon-40"), for: .normal)
        play2.setBackgroundImage(UIImage(named: "SwitchD-Icon-40"), for: .normal)

        do {
            //### You can get URL directly from Bundle
            //### It's better to apply forced-unwrapping as soon as possible, if you need it eventually.
            let audioURL = Bundle.main.url(forResource: "DTMF-1", withExtension: "mp3")!
            player = try AVAudioPlayer(contentsOf: audioURL)
            //### `prepareToPlay()` improves response for the first play.
            player?.prepareToPlay()

            let audioURL2 = Bundle.main.url(forResource: "DTMF-2", withExtension: "mp3")!
            player2 = try AVAudioPlayer(contentsOf: audioURL2)
            player2?.prepareToPlay()
        } catch {
            print(error)
            //... or any other things you need...
        }

        //...
    }

    //### Stop playing on transition to other ViewConrollers.
    override func viewWillDisappear(_ animated: Bool) {
        super.viewWillDisappear(animated)

        stopPlaying()
    }
}

  ask by Shahin translate from so

未解决问题?本站智能推荐:

2回复

迅捷2.0prepareForSegue无法正常工作

我正在尝试在正在制作的应用程序中使用prepareForSegue 。 prepare forSegue必须将一个类传递给单独的视图控制器。 这是prepareForSegue的代码 这些是第一个视图控制器继承的超类: 并且目标视图控制器仅从UIViewController继承。
1回复

单击MultipleUIButton如何同时播放多个声音?

我是Objective-C的新手。 请帮我。 我有一个viewController包含scrollview。 scrollView已启用分页,所以我每页有10页,我有30个按钮。 我的问题是,当单击多个按钮时,我想播放多个声音。 我的代码:- 问题是当我按下按钮时,只有一种声音被
1回复

迅捷3:如何添加UISlider?

我有带AVAudioPlayer ViewController 。 现在我有了这段代码 我想添加UISlider来更改音频文件中的擦洗。 怎么做?
1回复

为什么AVAudioPlayervar等于nil?-迅捷

这是我的功能: 我调试了应用程序,发现控制台告诉我:无法创建音频播放器 看起来像我的playIt var为零 我如何解决它?
1回复

背景中的迅捷音乐[重复]

这个问题已经在这里有了答案: 让其他应用播放背景音乐 2个答案 我正在使用以下功能在我的应用程序中播放声音fx。 我想做到这一点,以便用户可以同时收听他们的iphone音乐。 我也在多个视图控制器上使用此。.不确定是否会更改任何内容。 最简单的方法是什么?
1回复

如何在其他viewController中使用变量?-迅捷

我创建了LoginService类,以使用POST方法从Web服务获取数据,并在UIViewController调用该类。 它有效,但是我想在另一个ViewController显示变量loginObj.fullname值。 我尝试了很多方法,但是我得到的输出是一个空字符串。 我该怎么办?
1回复

在选择一行之后,该功能才能正常工作

我在viewcontroller中有一个tableview。 我有一个小功能来选择tableview中的所有行。 当我第一次显示ViewController并点击全选按钮时,该功能不起作用。 但是,如果我先选择一行,然后按全选按钮,则该功能将按预期工作,并且所有行均被选中。 我不确定为什
1回复

多个ViewController选择并快速执行功能

您好,我是迅速编写代码的新手,而且我一直在互联网上寻找如何执行此操作的方法,但没有找到任何帮助我解决困境的示例。 如果有人知道如何帮助我,请回复。 我正在使用两个视图控制器:在第一个viewcontroller(1)上,有一个带有应用程序名称的标签,在该标签下放置了两个按钮。 一个说英