ios - 在 iOS 中通知 A 类关于 B 类的最佳方式

标签 ios iphone audio delegation

我将要构建这个应用程序,用户可以在其中收听 uiTableView 中填充的轨道。当用户点击一行时,它应该通知其他类(我的音频播放器)有关此操作等。加载 mp3 网址。

Illustration of my storyboard architecture, the top line illustrates the two view controllers that needs to communiate

我选择在导航 Controller 前面有一个 View Controller 的原因很简单。我需要在每个 View Controller 上显示一个持久 View (我的音频播放器,标记为深灰色),我发现这个解决方案最简单。 我这里的问题是如何告诉音频播放器类关于 trackTableView 中发生的操作。我知道您可以使用委托(delegate),但不知道当中间有一个 navigationController 时如何以正确的方式完成它。

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

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

最佳答案

通常委托(delegate)是一个很好的模式,因为它是“最干净”的方式。接口(interface)都是设计等。

这种情况下的问题是,当您启动 tableview 的委托(delegate)时,您需要设置(您的)audioplayer 委托(delegate)。因此,您需要在代码的其他地方引用音频播放器。出于这个原因,我建议使用单例。

我想谈的最后一个模式是使用通知(NSNotificationCenter + NSNotification)。通常,您不只是想在用户选择新标题等时控制您的音频播放器,而且还会发生其他事情,例如更新播放列表、更新显示正在发生的事情的 View 等。

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

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

如果你不知道 NSNotificationCenter 是如何工作的,这里有一个简短的代码示例:

[[NSNotificationCenter defaultCenter] postNotificationName:@"START_MUSIC" object:nil userInfo:nil];

这将向所有等待名为 @"START_MUSIC" 的通知的听众发布通知。如果您需要提供额外的数据,例如选择了哪首歌等,您可以创建一个 NSDictionary 并将其添加到 userInfo 参数(我在此将其保留为 nil例)

然后在另一个你想接收这个通知的类中调用

[[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方法或者其他更详细的方法(比如停止监听)具体通知)。如果您只是调用此通用方法,您将停止使用此对象监听所有通知。

关于ios - 在 iOS 中通知 A 类关于 B 类的最佳方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21756861/

相关文章:

ios - 如何停止通过导航旋转 map ?这里是 iOS SDK

iphone - 在设置中临时禁用后 CLLocationManager 不返回位置

iphone - 当用户在 iOS 5 上锁定屏幕时 applicationMusicPlayer 停止

java - 在 Android 上通过套接字接收实时音频数据

c++ - 如何在 PCM 音频中使用 IMediaSample 检测静音

ios - iPhone 模拟器 Xcode 中的 AppStore

ios - 表达式不可赋值,MKAnnotation 类委托(delegate)的坐标属性

ios - AVPlayer 不播放本地 mp4

ios - InApp Purchase 产品列表不会在 iPhone 应用程序中加载

iphone - 通过 HTML 代码在 UIView 中使用透明背景色