0

问题是我设置了三个 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];
}

实现+标头的完整代码

http://pastebin.com/vL12zFrQ

任何帮助都会很棒。

4

1 回答 1

1

您有两个处理程序:一个用于通知,一个用于您的按钮操作(似乎您在应用程序中创建了一个播放/暂停按钮)。

您应该从按钮处理程序中删除此行,因为您的通知处理程序执行相同的工作。

[self._playPauseButton setTitle:@"Play" forState:UIControlStateNormal];

我也建议这样做

if (playbackState == MPMusicPlaybackStatePlaying) {
    [self.musicPlayer pause];
}
else {
    [self.musicPlayer play];
}

确保不会有任何您无法处理的状态阻碍您前进。(与您的通知处理程序相同的想法)

此外,@rckoenes 的建议很好,尝试处理每个通知,而不仅仅是您的对象。

还尝试删除 NSNotificationCenter 的 object 参数中的 self.musicPlayer 并检查它是否有效。

于 2013-09-25T13:43:43.500 回答