在iOS中向A类通知B类的最佳方式

在iOS中向A类通知B类的最佳方式,ios,iphone,audio,delegation,Ios,Iphone,Audio,Delegation,我将要构建这个应用程序,用户可以在其中收听uiTableView中填充的曲目。当用户点击一行时,它应该通知另一个类(我的音频播放器)此操作和ect。加载mp3 url 我选择在导航控制器前面有一个视图控制器的原因很简单。我需要在每个视图控制器上显示一个持久视图(我的音频播放器,用深灰色标记),我发现这个解决方案最简单。 我这里的问题是如何告诉audio player类trackTableView中发生的操作。我知道您可以使用委派,但不知道在中间有导航控制器的情况下如何以正确的方式完成委派 我考

我将要构建这个应用程序,用户可以在其中收听uiTableView中填充的曲目。当用户点击一行时,它应该通知另一个类(我的音频播放器)此操作和ect。加载mp3 url

我选择在导航控制器前面有一个视图控制器的原因很简单。我需要在每个视图控制器上显示一个持久视图(我的音频播放器,用深灰色标记),我发现这个解决方案最简单。 我这里的问题是如何告诉audio player类trackTableView中发生的操作。我知道您可以使用委派,但不知道在中间有导航控制器的情况下如何以正确的方式完成委派

我考虑过的另一件事是使用音频播放器作为单例(无论如何都是这样,因为我只需要音频播放器的一个实例),然后在需要时调用单例方法


处理它的最好方法是什么,单例方法还是委托?在这种情况下,如何进行授权?

通常,授权是一种很好的模式,因为它是“最干净”的方式。接口均为设计等

本例中的问题是,当您启动tableview的委托时,您需要设置(您的)audioplayer委托。因此,您需要在代码的其他地方引用audioplayer。出于这个原因,我建议使用单例

我想讨论的最后一种模式是使用通知(NSNotificationCenter+NSNotification)。通常情况下,您不仅希望在用户选择新标题时控制音频播放器,还需要进行其他操作,如更新播放列表、更新显示内容的视图等

如果这些东西都在代码的不同部分(而不是由音频播放器直接控制),那么通知也会非常方便

为了获得最佳实践,我建议:控制所有用于显示和管理中央单例播放列表的代码。如果这不是您所做的,则使用通知

如果您不知道NSNotificationCenter是如何工作的,下面是一个简短的代码示例:

[[NSNotificationCenter defaultCenter] postNotificationName:@"START_MUSIC" object:nil userInfo:nil];
这将向所有等待名为“开始音乐”的通知的听众发布通知。。如果您需要提供额外的数据,例如选择了哪首歌曲等,您可以创建一个
NSDictionary
,并将其添加到
userInfo
-参数中(在本例中,我将其保留为零)

然后在另一个类中,您要在其中接收此通知,您可以调用

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(startMusic:) name:@"START_MUSIC" object:nil];
你必须实施

- (void)startMusic:(NSNotification *)notification
{
    // if you provided some extra information, this is where you get your dictionary!
    NSDictionary* userInfo = notification.userInfo;
}
当解除分配此对象时,还应停止侦听通知!因此,将此添加到您的
-(void)dealloc
方法中:

- (void)dealloc
{
     // rest of your dealloc code!
    [[NSNotificationCenter defaultCenter] removeObserver:self];
    // if not using ARC:
    // [super dealloc]
}

通常,如果要停止侦听通知,可以使用通知中心的
-(void)removeObserver:(id)observer
方法或其他更详细的方法一次(例如停止侦听特定通知)。如果您只调用此常规方法,您将停止侦听此对象的所有通知。

您可以使用共享实例(只需将其称为sharedPlayer)处理播放,将PlayingViewController视为普通实例。当用户点击tableview单元格选择曲目时,使用所选的曲目分配并按下PlayingViewController。然后调用视图控制器中的SharedLayer。

这是一个很好理解的例子。我想我将使用单例模式,并尝试使用通知中心进行测试。谢谢!:)没问题,伙计。如果遇到任何障碍,请告诉我嘿,我忘了提到,您应该在对象的dealoc方法中以观察者身份删除当前对象!