少し整理が必要なコードをいくつか継承しました。このアプリにはいくつかのコア サウンドがあり、現在、AVAudioPlayer
さまざまな にアタッチされた多数のインスタンスがViewController
すべて同じ少数のサウンドを再生しています。
リファクタリングの演習の一環として、私は というシングルトン クラスを実装することにしましたSoundController
。このクラスには、AVAudioPlayer
再生が必要なサウンドごとに 1 つが含まれ、それぞれViewController
が独自のインスタンスを作成する代わりに、1 つだけを簡単に利用できます。
[[SoundController controller].majorFunctionSound playAtTime:0];
もう 1 つの重要な点は、遅延を最小限に抑えるために、使用する前にすべてのサウンドに対して prepareToPlay: が呼び出されていることを確認することです。ほんの一握りのサウンドしかなく、それらはすべてユーザー セッション中に使用される可能性が高いため、SoundController が最初にインスタンス化されるときにすべてのサウンドを (バックグラウンド スレッドで) プリロードすることは理にかなっています。init メソッドには、次のようなものがあります。
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, nil, ^(void)
{
NSURL *soundURL = [NSURL fileURLWithPath:[NSString stringWithFormat:@"%@/MAJOR FUNCTION.m4a", [[NSBundle mainBundle] resourcePath]]];
_majorAudioSound = [[AVAudioPlayer alloc] initWithContentsOfURL:soundURL error:nil];
[_majorAudioSound prepareToPlay];
});
majorAudioSoundは(readonly, strong)
。@synthesize majorAudioSound = _majorAudioSound
.
私の懸念は、同時実行性の点でこれがどれほどうまく機能しないか (またはうまく機能するか) と、コードを改善するために何ができるかです。具体的には、これを行うと:
[[SoundController controller].majorFunctionSound playAtTime:0];
バックグラウンドの初期化ブロックがまだ完了しているかどうかによっては、majorFunctionSound が適切に開始されない可能性が明らかにあります。プロパティが返さnil
れ、サウンドが再生されないという最悪の事態が発生する可能性はありますか?
他にどのような問題が考えられますか? AVAudioPlayer が適切に設定されていることを常に確認する方法はありますか?