DispatchSourceTimer使应用程序崩溃,而segue上没有错误

时间:2017-10-21 16:32:14

标签: ios swift avfoundation grand-central-dispatch

我有一个奇怪的行为,我的应用程序在切换回前一个视图控制器后崩溃。我有一个显示配置文件控制器,然后我去编辑配置文件控制器。我在那里录制了一个音频文件,然后在1秒后回到我以前的视图控制器,应用程序崩溃,没有错误只是一个

  

Thread1:EXC_BREAKPOINT(代码= 1,子代码= 0x1026eb43c)

我使用DispatchSourceTimer录制音频,以便在录制时在视图上添加计数器,并以这种方式初始化全局变量:

var nonObservalePropertyUpdateTimes:DispatchSourceTimer = DispatchSource.makeTimerSource(flags: [], queue: DispatchQueue.main)

以下是我使用名为AudioManager的Singltone类进行录制的方法:

@IBAction func micButtonTapped(_ sender: UIButton) {

    if recButtonIsChecked {

        if AudioManager.shared.record(fileName: "recbio") {

        sender.setBackgroundImage(UIImage(), for: .normal)
        sender.setImage(#imageLiteral(resourceName: "pauseProfileButton"), for: .normal)
        playRecordButton.setBackgroundImage(#imageLiteral(resourceName: "editProfilePlay"), for: .normal)
        recordVoiceLabel.isHidden = true
        recButtonIsChecked = false
        secondsLabel.isHidden = false

        nonObservalePropertyUpdateTimes.resume()

        }


    nonObservalePropertyUpdateTimes.setEventHandler {[weak self] in

        self?.secondsLabel.text = String(describing: AudioManager.shared.countDownTimer)

    }

    nonObservalePropertyUpdateTimes.schedule(deadline: DispatchTime.now(), repeating: DispatchTimeInterval.milliseconds(100))

    } else {
        sender.setBackgroundImage(#imageLiteral(resourceName: "editProfileMicButton"), for: .normal)
        sender.setImage(UIImage(), for: .normal)
        recButtonIsChecked = true
        stopRecording()

    }

}

我认为DispatchQueue中发生了一些导致此崩溃的错误,因为当我从编辑配置文件视图控制器中删除nonObservalePropertyUpdateTimes对象时,当我转到我的应用程序时,应用程序没有崩溃配置文件视图控制器。

所以我试着这样做,但没有帮助:

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)

    nonObservalePropertyUpdateTimes.suspend()
    nonObservalePropertyUpdateTimes.cancel()

}

或者可能有deinit这个Dispatch对象的方法。我真的不知道出了什么问题,做了什么。我甚至没有正确的错误信息。

3 个答案:

答案 0 :(得分:2)

感谢每一位试图帮助Rob的人。我只是以这种方式对DispatchSourceTimer进行了初始化,它起作用了,没有再崩溃了。

deinit {
    nonObservalePropertyUpdateTimes.resume()
}

答案 1 :(得分:0)

确保UI活动在主线程内运行:

DispatchQueue.main.async {
self?.secondsLabel.text = String(describing: AudioManager.shared.countDownTimer)

}

答案 2 :(得分:0)

暂停后无法取消计时器。必须先恢复然后再取消计时器。

https://medium.com/@danielgalasko/a-background-repeating-timer-in-swift-412cecfd2ef9