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。
所以接下来的目标就是把每个歌曲中图片改成自己特有的,不再是一样的。
那些将会涉及到线程里的知识,当然会比较复杂。
相关文章推荐
- IOS菜鸟的所感所思(八)——coreData与网络歌曲的本地化
- IOS菜鸟的所感所思(十四)——解析专辑获得专辑中的歌曲以及图片的优化
- IOS菜鸟的所感所思(四)——自定义UICollectionViewCell以及网络数据的添加。
- IOS菜鸟的所感所思(七)——获取网络图片并添加
- IOS菜鸟的所感所思(十二)——专辑接口和专辑中歌曲数据的获得(下)
- IOS菜鸟的所感所思(五)——对歌曲地址的获取与解析
- IOS菜鸟的所感所思(十)——专辑接口和专辑中歌曲数据的获得(上)
- IOS菜鸟的所感所思(十一)——统计文本中单词出现的次数并按照次数高低排序
- IOS菜鸟的所感所思(十三)——数据的图形化
- IOS菜鸟的所感所思(二)——UIKit中的UIDynamicAnimator
- IOS菜鸟的所感所思——UITableView中数据之间的顺序与反向传递
- IOS菜鸟的所感所思(三)——通过服务器接口获取数据
- IOS菜鸟的所感所思(十六)—— 立体式的切换视图
- IOS菜鸟的所感所思(十五)—— UIScrollView和UIPageControl的组合
- iOS音频的后台播放总结(后台网络请求歌曲,Remote控制,锁屏封面,各种打断)
- iOS音频的后台播放总结(后台网络请求歌曲,Remote控制,锁屏封面,各种打断)
- iOS音频的后台播放总结(后台网络请求歌曲,Remote控制,锁屏封面,各种打断)
- iOS音频的后台播放总结(后台网络请求歌曲,Remote控制,锁屏封面,各种打断)
- iOS音频的后台播放总结(后台网络请求歌曲,Remote控制,锁屏封面,各种打断)
- IOS菜鸟的所感所思(九)——收藏视图的创建并对cell的初始化