iOS之音乐播放器 视频播放器 多线程
Day07
音乐播放器
step1:导入头文件
#import<AVFounfation/AVFoundation.h>
创建音乐播放器的实例AVAudioPlayer *players=[[AVAudioPlayeralloc]initWithContentsOfURL:[NSURL fileURLWithPath:self.musicPath] errol :nil]
开启音乐播放器[playersplay]
players.Volume=? 设置音量的大小
players.duration=?歌曲总时间
players.currentTimer=?当前播放的事件
[playerspause]暂停
Day8
1.视频播放器
step1:导入头文件
#import<MediaPlay/MediaPlayer.h>
step2:创建MPMoviePlayerController的实例
self.player=[[MPMoviePlayerControlleralloc ]initWithControllerURL:[NSURLfileURLWithPath: @"/Users/tarena6/Desktop/test/第三个月/MV/mtv.mp4"]]
step3:设置播放位置
self.player.view.frame=CGRectMake(0,20,320,200);
step4:设置播放位置
self.player.controlStyle=MPMovieControlStyleDefault
step5:添加到父视图 并启动播放
[self.viewaddSubView:self.player.view]
[self.playerplay];
step6:用于监听截屏
//监听截屏通知
[[NSNotificationCenterdefaultCenter]addObserver:self selector:@selector(didReceiveImage:)name:MPMoviePlayerThumbnailImageRequestDidFinishNotification object:nil];
//监听播放完成的通知
//接受截屏的通知
[self.player requestThumbnailImagesAtTimes:@[@(self.player.currentPlaybackTime)]timeOption:MPMovieTimeOptionExact];
-(void)didReceiveImage:(NSNotification*)noti{
NSLog(@"%@",noti);
UIImage *image = [noti.userInfoobjectForKey:MPMoviePlayerThumbnailImageKey];
UIImageView *iv = [[UIImageViewalloc]initWithFrame:CGRectMake(0, 300, 320, 200)];
iv.image = image;
[self.view addSubview:iv];
}
step7:监听播放完成
[[NSNotificationCenterdefaultCenter]addObserver:self selector:@selector(endPlay:)name:MPMoviePlayerPlaybackDidFinishNotification object:nil];
2 多线程
切记:耗时操作不能放到主线程中 否者会导致界面阻塞
修改页面的代码不要放到子线程中(如果修改页面的操作放在子线程的最后则可以放在子线程中)
应用场景:1 解决耗时操作的阻塞问题 2 同时做几件事 3 多线程的下载
[VsetNeedsDisplay];//刷新本空间显示
[VsetNeedsLayout];//刷新子空间的显示
创建线程的三种方式
1 NSThread
开辟线程:
[NSThreaddatachNewThreadSelector:@Selector(addThread)toTarget:selfwithObjectObject:nil];
线程睡眠:[NSThreadsleepForTimeInterval:1];
返回主线程:
[selfperformSelectorOnMainThread:@selector(updateUI:) withObject:v waitUntilDone:NO]
2.GCD:GrandCentral Dispatch (中央任务分发)基于C语言的 执行的效率较高
创建线程队列 串行队列
dispatch_queue_t myqueue1=dispatch_queue_create(“myqueue”,null)
获取系统提供的并行队列
dispatch_queue_t myqueue2=dispath_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
执行队列中的某段代码 在某个队列中
dispatch_async(xxxx, ^{ });
执行一段代码在主线程中
dispatch_async(dispatch_get_main_queue(), ^{});
3 NSOperation:更灵活 可以设置线程和线程之间的关系 灵活高度
两种方式:
方式一:NSBlockOperation *op1 = [NSBlockOperation blockOperationWithBlock:^{ }];使用block块创建
方式二:使用初始化方式创建 NSInvocationOperation *op2 = [[NSInvocationOperationalloc]initWithTarget:self selector:@selector(runAction) object:nil];
直接 [xxx start]相当于在主线程中直接使用 相当于主线程
要想使其成为子线程必须把他们放到线程对类中 可以通过设置最大并行的线程数来实现并行或者是串行
//添加到子线程队列中,把operation 添加倒队列的同时 开启operation
NSOperationQueue *opQueue=[[NSOperationQueue alloc]init];
//设置最大并行线程数量
[opQueuesetMaxConcurrentOperationCount:1];
//添加线程之间的依赖
[op1 addDependency:op2]; op2执行结束之后op1才开始执行
//将两个线程添加倒线程队列中
[opQueue addOperation:op1];
[opQueue addOperation:op2]
线程队列
1 串行队列:依次执行队列中的线程
2 并行队列:同时执行队列中的线程
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。