2014-02-06 105 views
0

我在IBAction中有下面的代碼。我想測量AVSpeechSynthesizer在指令列表中運行的確切時間。但是,executionTime會立即記錄下來,而不是在循環結束時(返回時間少於1秒,而不是我預期的10-15秒)。我做錯了什麼?NSLog立即執行而不是循環結束

NSDate *methodStart = [NSDate date]; 

for (NSString* direction in directions) { 

    AVSpeechUtterance *aDirection = [[AVSpeechUtterance alloc] initWithString:direction]; 
    aDirection.rate = .3; 
    [self.synthesizer speakUtterance:aDirection]; 
} 

NSDate *methodFinish = [NSDate date]; 
NSTimeInterval executionTime = [methodFinish timeIntervalSinceDate:methodStart]; 
NSLog(@"executionTime = %f", executionTime); 

回答

7

這是因爲speakUtterance調用是異步的。 讓您的課程實現AVSpeechSynthesizerDelegate協議並將其設置爲AVSpeechSynthesizer的委託,並最終實現speechSynthesizer:didFinishSpeechUtterance:消息。

+2

此委託將爲每個'AVSpeechUtterance'調用一次,所以你也必須算調用僅在最後打印的時候,或者你可以有多個日誌條目,只關心最後一個。 –

+0

開始iOS程序員仍然在努力瞭解如何使用代表,但這給了我一個方向。謝謝! – babyjordan

5

我不知道一個事實,但我會假設speakUtterance不是阻止呼叫。意思是你想把它做的事情添加到發生在後臺線程中的事情隊列中,然後代碼立即返回給你,讓你可以繼續在代碼中使用其他東西,而不需要等待話語完成。

我不知道你會怎麼知道操作系統需要多長時間來創建和讀出它創建的音頻。

編輯:但顯然Merlevede呢......