在我在iOS应用程序中执行其他操作之前,我需要播放3秒左右的短暂声音(如倒计时蜂鸣声)。
用例如下:
用户单击按钮...发出哔哔声(使用AudioServicesPlaySystemSound
发出简单的哔声...然后运行方法的其余部分。
我似乎找不到在播放音调时阻止我的方法的方法。
我尝试了以下内容:
[self performSelector:@selector(playConfirmationBeep) onThread:[NSThread currentThread] withObject:nil waitUntilDone:YES];
但是在执行其余方法时,音调会同步播放。
上述电话我错过了什么?
答案 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
。你绝对不想做的是阻止主运行循环;这将阻止重要的系统事件,如低内存警告通过,从而可能导致您的应用程序被强制退出。您可能仍然希望遵守设备轮换等内容。