目标:播放已经获得的MP3网络地址的歌曲,以及对播放对象的观察。
一:播放音乐的接口
PlayMusic类的代码:
- (void)playMusic:(NSString *)musicPath musicName:(NSString *)name{
NSURL *url = [NSURL URLWithString:musicPath];
//播放在线音乐
AVPlayerItem *playerItem = [[AVPlayerItem alloc] initWithURL:url];
_avPlayer = [[AVPlayer alloc] initWithPlayerItem:playerItem];
[_avPlayer play];
}
参数:歌曲的网络路径,在这个方法里,我们只需要在线听音乐即可,就只要传一个参数。这样在主界面中点击cell时,传入该cell的对象到这个方法。就可以播放音乐。SearchSongVC.m文件中:
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{
MusicData *musicData = self.getDataArray[indexPath.row] ;
[self getSongID:musicData];
}
- (void)getSongID:(MusicData *)musicData{
[FetchDataFromNet fetchSongDetailInfo:musicData callback:^(id item,NSString *musciImage, NSError *error){
if (error) {
NSLog(@"error = %@",error);
}else{
NSLog(@"%@",item);
[self.playMusic playMusic:item];
}
}];
}
说明:当我们点击一行cell时,会触碰第一个方法,接着我们需要改行的对象 self . getDataArray [indexPath. row ],作为参数到网络方法中去获取该歌曲的网络路径,接着把该路径作为参数传入播放音乐的接口的方法中,去完成播放。KVO模式
- (void)playMusic:(NSString *)musicPath{
NSURL *url = [NSURL URLWithString:musicPath];
//移除观察者
if (_avPlayer) {
[_avPlayer removeObserver:self forKeyPath:@"status"];
}
//播放在线音乐
AVPlayerItem *playerItem = [[AVPlayerItem alloc] initWithURL:url];
_avPlayer = [[AVPlayer alloc] initWithPlayerItem:playerItem];
[_avPlayer addObserver:self forKeyPath:@"status" options:0 context:nil];
}
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context{
if (object == _avPlayer) {
if (_avPlayer.status == AVPlayerStatusReadyToPlay) {
[_avPlayer play];
}
}
}
当然这是SearchSongVC.h里面需要定义的变量
@property (nonatomic, strong) AVPlayer *avPlayer;
- (void)playMusic:(NSString *)musicPath;
这样我们就可以播放音乐了,但在那个搜素界面中,每个歌曲的图片都是一样的,这就不是很好。
album = {
alias = (
);
artist = {
albumSize = 0;
alias = (
);
briefDesc = "";
id = 0;
img1v1Id = 0;
img1v1Url = "http://p3.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg";
musicSize = 0;
name = "";
picId = 0;
picUrl = "http://p3.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg";
trans = "";
};
artists = (
{
albumSize = 0;
alias = (
);
briefDesc = "";
id = 50890;
img1v1Id = 0;
img1v1Url = "http://p4.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg";
musicSize = 0;
name = "Colbie Caillat";
picId = 0;
picUrl = "http://p3.music.126.net/6y-UleORITEDbvrOLV0Q8A==/5639395138885805.jpg";
trans = "";
}
);
blurPicUrl = "http://p4.music.126.net/q8jkeiD7uMfJIszznqGJ1w==/628920651095764.jpg";
这是从中节选的一段,其中红色的部分,你可以在浏览器中搜一下,可以发现是每个歌曲的logo。