NSLog立即执行而不是在循环结束时执行

时间:2014-02-06 16:23:38

标签: ios objective-c nsdate

我在IBAction中有以下代码。我想测量AVSpeechSynthesizer在一系列方向上运行所花费的确切时间。但是,executionTime会立即记录而不是在循环结束时记录(返回不到一秒,而不是我预期的10-15秒)。我做错了什么?

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);

2 个答案:

答案 0 :(得分:7)

那是因为speakUtterance调用是异步的。 让您的类实现AVSpeechSynthesizerDelegate协议并将其设置为AVSpeechSynthesizer的委托,最后实现speechSynthesizer:didFinishSpeechUtterance:消息。

答案 1 :(得分:5)

我不知道一个事实,但我认为speakUtterance不是阻塞电话。意味着你想要它做什么被添加到后台线程中发生的事物的队列中,然后代码立即返回给你,允许你继续使用代码中的其他东西而不让该线程等待话语完成。

我不知道你怎么知道操作系统创建和读出它创建的音频需要多长时间。

编辑:但显然Merlevede确实......