2

iOSアプリケーションで他のアクションを実行する前に、3秒ほどの短い音(カウントダウンビープ音など)を再生する必要があります。

ユースケースは次のとおりです。

ユーザーがボタンをクリックすると...ビープ音が鳴ります(AudioServicesPlaySystemSound...を使用した単純なビープ音が鳴り、メソッドの残りの部分が実行されます。

トーンが再生されている間、メソッドをブロックする方法が見つからないようです。

私は次のことを試しました:

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

ただし、メソッドの残りの部分が実行されている間、トーンは同期して再生されます。

上記の呼び出しで何が欠けていますか?

4

1 に答える 1

2

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関連する期間だけ無効にする必要があります。絶対にやりたくないのは、メインの実行ループをブロックすることです。これにより、メモリ不足の警告などの重要なシステムイベントが発生しなくなり、アプリが強制終了される可能性があります。また、おそらくデバイスの回転などにも従いたいと思うでしょう。

于 2012-08-15T23:20:50.597 に答える