2014-10-18 6 views
1

Я использую AVAudioPlayer для воспроизведения звука. Звук воспроизводится после проверки движения с акселерометра. Все работает нормально. Я заметил, что вывод println() периодически показывает повторяющийся символ. Вот код для вывода на консоль:Swift 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

Является ли «очередь» переданной «startAccelerometerUpdatesToQueue» случайной очереди? –

+0

Должен быть фон, не так ли? let queue = NSOperationQueue() – billy

+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-го обновления или чего-то еще.

+1

Вы также можете использовать 'NSLog()', который уже синхронизирован. –