问题是我有三个NSNotificationcenter设置来监听用户更改歌曲,音量和播放列表。该应用程序可以正常播放用户从播放列表中选择的歌曲。
当用户选择要播放的歌曲时,它通常会注册用户播放歌曲的动作并更改播放状态,但有时却无法这样做。创建一个只允许播放和播放而不是停止的连续循环。 (基本上代码有间歇性故障。)
我认为问题是来自一个动作的NSNotificationcenter调用被另一个NSNotificationcenter调用覆盖。取消一个呼叫而不是另一个呼叫。从而使用户无法停止播放歌曲。
应用程序功能:允许用户从PickerView中选择播放列表,从播放列表中加载歌曲,并允许用户从TableView中选择要播放的歌曲。
- (void)addMusicPlayerObserver {
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleNowPlayingSongStateChanged:)
name:MPMusicPlayerControllerNowPlayingItemDidChangeNotification
object:self.musicPlayer];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handlePlaybackStateChanged:)
name:MPMusicPlayerControllerPlaybackStateDidChangeNotification
object:self.musicPlayer];
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(handleVolumeChangedFromOutSideApp:)
name:MPMusicPlayerControllerVolumeDidChangeNotification
object:self.musicPlayer];
[self.musicPlayer beginGeneratingPlaybackNotifications];
}
- (void)removeMusicPlayerObserver {
[[NSNotificationCenter defaultCenter] removeObserver:self
name:MPMusicPlayerControllerNowPlayingItemDidChangeNotification
object:self.musicPlayer];
[[NSNotificationCenter defaultCenter] removeObserver:self
name:MPMusicPlayerControllerPlaybackStateDidChangeNotification
object:self.musicPlayer];
[[NSNotificationCenter defaultCenter] removeObserver:self
name:MPMusicPlayerControllerVolumeDidChangeNotification
object:self.musicPlayer];
[self.musicPlayer endGeneratingPlaybackNotifications];
}
实施+标题的完整代码
任何帮助都会很棒。
答案 0 :(得分:1)
你有两个处理程序:一个用于通知,一个用于按钮操作(似乎你在应用程序中创建了一个播放/暂停按钮)。
您应该从按钮处理程序中删除此行,因为您的通知处理程序执行相同的工作。
[self._playPauseButton setTitle:@"Play" forState:UIControlStateNormal];
我也建议做
if (playbackState == MPMusicPlaybackStatePlaying) {
[self.musicPlayer pause];
}
else {
[self.musicPlayer play];
}
确保不会有任何你没有处理阻止的状态。 (和你的通知处理程序一样)
另外,@ rckoenes的建议很好,尝试处理每个通知,而不仅仅是你的一个对象。
还尝试删除NSNotificationCenter的object参数中的self.musicPlayer,然后检查它是否有效。