iphone - 停止其他类(class)的声音

标签 iphone ios multithreading audio

我在classA中播放过声音,有人知道如何在classB中停止播放吗?

我已经阅读了几篇文章,其中大多数只是提到创建实例(即.h中的Class A * a和.m中的= [[[Class A alloc] init])。由于某些原因,这将无法正常工作。

以下是一些代码:
在类里面

path1 = [[NSBundle mainBundle]  pathForResource:[@"songName" ofType:@"mp3"];

av1 = [[AVAudioPlayer alloc] initWithContentsOfURL:[NSURL fileURLWithPath: path1] error:NULL];
[av1 play];

在classB.m中

一个= [[classA alloc] initWithNibName:nil bundle:nil];
 [a.av1 stop];

最佳答案

你在这里做什么

a = [[classA alloc] initWithNibName:nil bundle:nil];
[a.av1 stop]; 

是错的。您正在创建一个全新的对象,很可能没有播放任何音乐,并向其播放器发送了stop消息。如果要停止播放器在另一个类别中,则必须存储另一个类别的assign ed引用。如果您希望使它们独立,则可以查看通知。 This 是Apple的权威指南。基本上,这将涉及将A注册为通知的观察者,然后当B准备播放时,它将发布将要播放音乐的通知。当A收到该通知时,应关闭其音乐。

因此,在initA中,将自己注册为观察者,
[[NSNotificationCenter defaultCenter] addObserver:self 
                                         selector:@selector(turnOffMusic:) 
                                             name:@"BWillPlayMusicNotification"
                                           object:nil];

然后当B对象准备播放音乐时,发布通知,
[[NSNotificationCenter defaultCenter] postNotification:@"BWillPlayMusicNotification"];

这将导致A的turnOffMusic被调用,这几乎可以做到,
- (void)turnOffMusic:(NSNotification *)notification {
    [self.av1 stop];
}

请记住,在释放对象时停止监听通知,
[[NSNotificationCenter defaultCenter] removeObserver:self];

这种方法使您可以使两个类保持独立。

关于iphone - 停止其他类(class)的声音,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6307783/

相关文章:

ios - 自定义键盘 : Hub connection error

java - 试图理解 join() 方法

c# - 多线程:在 lock 语句中使用 BeginInvoke 可以吗?

iOS9 Developer Trust App 无网络连接错误

iphone - 使用 IP 地址和/或主机名获取 Bonjour 地址

ios - 使用 __bridge 转换 ABPersonCopyImageDataWithFormat 的结果以创建 UIImage 时如何防止对象的潜在泄漏?

iOS paypal API - 苹果拒绝

android - PhoneGap 能否将我的基于 Web 的应用程序显示为嵌入式浏览器?

iphone - 如何在两个以上的 UIView 之间做翻转动画?

java - 处理程序和线程/可运行