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

目标:播放已经获得的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。
所以接下来的目标就是把每个歌曲中图片改成自己特有的,不再是一样的。
那些将会涉及到线程里的知识,当然会比较复杂。











评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值