2014-02-06 43 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呢......