AudioServicesPlaySystemSound
非同期であるため、ブロックすることはできません。あなたがしたいのは、再生が終了したときにオーディオサービスに通知するようにすることです。あなたは経由でそれを行うことができますAudioServicesAddSystemSoundCompletion
。
これは経営幹部レベルの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をブロックしたい場合で、クラスがView Controllerであると仮定すると、おそらくself.view.userInteractionDisable
関連する期間だけ無効にする必要があります。絶対にやりたくないのは、メインの実行ループをブロックすることです。これにより、メモリ不足の警告などの重要なシステムイベントが発生しなくなり、アプリが強制終了される可能性があります。また、おそらくデバイスの回転などにも従いたいと思うでしょう。