我继承了一些需要整理的代码。该应用程序有一些核心声音,目前,有很多AVAudioPlayer
实例附加到各种ViewController
播放相同的几个声音。
作为重构练习的一部分,我决定实现一个名为SoundController
. 这个类将为AVAudioPlayer
需要播放的每个声音包含一个,而不是每个ViewController
实例化自己的,他们可以轻松地只使用一个:
[[SoundController controller].majorFunctionSound playAtTime:0];
另一个重要的事情是确保在所有声音被使用之前都调用了 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];
});
主要音频是(readonly, strong)
. @synthesize majorAudioSound = _majorAudioSound
.
我担心的是这在并发方面的工作有多差(或好),以及我可以做些什么来改进代码。具体来说,如果我这样做:
[[SoundController controller].majorFunctionSound playAtTime:0];
显然,majorFunctionSound 有可能无法正确启动,具体取决于后台初始化块是否已完成。nil
财产返回并且声音根本不播放会发生更糟糕的情况吗?
可能还有什么问题?有没有办法始终确保 AVAudioPlayer 已正确设置?