我正在编写一个闹钟应用程序,我需要让用户选择要唤醒的铃声。我有一个带有我的声音列表的UITableView,当用户点击我希望它播放的声音时。
然而,除非我跨过调用到AudioServicesPlaySystemSound(或者我在听到声音后触发的AudioServicesDisposeSystemSoundID调用上设置断点),否则我的声音不会播放。
我有一个理论认为这是一个主线程问题所以我使用了performSelectorOnMainThread:
[self performSelectorOnMainThread:@selector(playWakeUpSound)
withObject:nil
waitUntilDone:true];
但这没有帮助。 (waitUntilDone的值似乎并不重要。)
This question很有希望,但我检查了一下,我只调用了我的方法一次。
答案 0 :(得分:1)
这只是猜测,因为我不知道playWakeUpSound中有什么。如果你在该调用和ARC中使用AVAudioPlayer,可能是因为它正在发布。将AVAudioPlayer的实例存储为类的成员,它应该播放。
@interface MyClass
{
AVAudioPlayer *player;
}
@end
然后在实施中:
@implementation MyClass
- (void)playWakeUpSound {
// Assuming name and extension is set somewhere.
NSURL* musicFile = [NSURL fileURLWithPath:[[NSBundle mainBundle] pathForResource:name ofType:extension]];
NSError* error = nil;
player = [[AVAudioPlayer alloc] initWithContentsOfURL:musicFile error:&error];
if (error) {
NSLog(@"%@", error.localizedDescription);
} else {
[player play];
}
}
@end