您的位置:首页 > 理论基础 > 计算机网络

IOS菜鸟的所感所思(六)——网络歌曲的播放与kvo模式

2015-05-28 17:39 309 查看

目标:播放已经获得的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。
所以接下来的目标就是把每个歌曲中图片改成自己特有的,不再是一样的。
那些将会涉及到线程里的知识,当然会比较复杂。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐