我正在使用AVAudioPlayer播放声音。在我检查加速度计的移动后播放声音。一切正常。我注意到println()的输出会定期显示重复的字符。以下是输出到控制台的代码:
motionManager.accelerometerUpdateInterval = (1/40)
motionManager.startAccelerometerUpdatesToQueue(queue) { accelerometerData, error in
var x = accelerometerData.acceleration.x
if x > 0.75 {
println("X is greater than 0.5: \(accelerometerData.acceleration.x)")
if !self.audioPlayer.playing {
self.toggleAVPlayer()
}
}
以下是来自控制台的示例:
X is greater than 0.5: 0.767669677734375
X is greater than 0.5: 1.41529846191406
XX iiss ggrreeaatteerr tthhaann 00..55:: 20..2824260008041529240772063516
2
X is greater than 0.5: 2.65106201171875
为什么println()的调用会给出重复的字符?
答案 0 :(得分:2)
正在发生的事情是加速计正在以足够快的速度向队列发布更新,以便队列同时运行某些更新并且您的打印语句重叠。解决这个问题的最简单方法是简单地将println
发送回主队列:
motionManager.accelerometerUpdateInterval = (1/40)
motionManager.startAccelerometerUpdatesToQueue(queue) { accelerometerData, error in
var x = accelerometerData.acceleration.x
if x > 0.75 {
dispatch_async(dispatch_get_main_queue()) {
println("X is greater than 0.5: \(accelerometerData.acceleration.x)")
}
if !self.audioPlayer.playing {
self.toggleAVPlayer()
}
}
我会小心,但是文档说:
由于处理的事件可能以高速率到达,因此不建议使用主操作队列。
除非需要调试该数据,否则不应将println
保留在那里。您可能还想考虑仅打印每10次或第100次更新等。