iOS在执行其他操作之前播放声音

时间:2012-08-15 23:01:40

标签: ios multithreading audio

在我在iOS应用程序中执行其他操作之前,我需要播放3秒左右的短暂声音(如倒计时蜂鸣声)。

用例如下:

用户单击按钮...发出哔哔声(使用AudioServicesPlaySystemSound发出简单的哔声...然后运行方法的其余部分。

我似乎找不到在播放音调时阻止我的方法的方法。

我尝试了以下内容:

[self performSelector:@selector(playConfirmationBeep) onThread:[NSThread currentThread] withObject:nil waitUntilDone:YES];

但是在执行其余方法时,音调会同步播放。

上述电话我错过了什么?

1 个答案:

答案 0 :(得分:2)

AudioServicesPlaySystemSound是异步的,因此您无法阻止它。您要做的是让音频服务在播放完成后通知您。您可以通过AudioServicesAddSystemSoundCompletion

执行此操作

这是一个C级API,所以事情有点难看,但你可能想要这样的东西:

// somewhere, a C function like...
void audioServicesSystemSoundCompleted(SystemSoundID ssID, void *clientData)
{
    [(MyClass *)clientData systemSoundCompleted:ssID];
}

// meanwhile, in your class' init, probably...
AudioServicesAddSystemSoundCompletion(
   soundIDAsYoullPassToAudioServicesPlaySystemSound,
   NULL, // i.e. [NSRunloop mainRunLoop]
   NULL, // i.e. NSDefaultRunLoopMode
   audioServicesSystemSoundCompleted,
   self);

// in your dealloc, to avoid a dangling pointer:
AudioServicesRemoveSystemSoundCompletion(
             soundIDAsYoullPassToAudioServicesPlaySystemSound);

// somewhere in your class:
- (void)systemSoundCompleted:(SystemSoundID)sound
{
    if(sound == soundIDAsYoullPassToAudioServicesPlaySystemSound)
    {
        NSLog(@"time to do the next thing!");
    }
}

如果您确实想在播放声音时阻止UI,并假设您的类是视图控制器,则可能只需在相关时段禁用self.view.userInteractionDisable。你绝对不想做的是阻止主运行循环;这将阻止重要的系统事件,如低内存警告通过,从而可能导致您的应用程序被强制退出。您可能仍然希望遵守设备轮换等内容。