只考虑了实现,简单说一下原理,所以贼简单!
@implementation VideoViewController
{
NSTimer *myChatTimer;
int chatTime;
UILabel *chatTimeLabel;
//other param
}
//定义timer属性
-(void)startTimer{
chatTime = 0;
myChatTimer = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(timerFiredMethod:) userInfo:nil repeats:YES];
}
//定时器启动后的执行函数
-(void)timerFiredMethod:(NSTimer *)sender{
chatTime++;
int hours, minutes, seconds;
hours = chatTime / 3600;
minutes = (chatTime % 3600) / 60;
seconds = (chatTime %3600) % 60;
chatTimeLabel.text = [NSString stringWithFormat:@"%02d:%02d:%02d", hours, minutes, seconds];
}
//停止定时器
-(void)stopTimer{
[myChatTimer invalidate];
myChatTimer = nil;
chatTime = 0;
}
//....
@end
这是我在一个视频通话醒目中用的方法,在remoteVideo成功连接时,调用startTimer,在通话结束时调用stopTimer即可。
myChatTimer = [NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(timerFiredMethod:) userInfo:nil repeats:YES];
意思是自建立Timer后每隔1.0s就fire一次,就去调用timerFiredMethod,而这个method就是自定义的方法了,想让程序每隔1秒干点什么就写点什么,最后在stopTimer中用invalidate方法来结束timer,做一些清理工作。
done!
补充一点,如果想让定时器在某种情况下停止计时,之后再恢复计时,就像音乐播放器中的计时器,在音乐播放器中,Timer可以有几个作用:
- 更新播放进度条;
- 更新播放时间;
- 。。。
当然,对于每个功能可以分别定义Timer变量,对于1,2功能,完全可以定义一个Timer,然后在一个firedMethod中同时实现更新进度。
@interface ViewController ()
{
AVAudioPlayer *avAudioPlayer;
UIProgressView *progressV;
UISlider *progressSlider;
UILabel *playTime;
UILabel *playVolume;
NSTimer *myTimer;
NSTimer *mySliderTimer;
BOOL isPaly;
}
-(void)startMyTimer{
if(!myTimer){
myTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateProgress:) userInfo:nil repeats:YES];
}
}
//播放进度条
- (void)updateProgress:(NSTimer *)sender
{
//通过音频播放时长的百分比,给progressview进行赋值;
NSLog(@"current time : %.2f",avAudioPlayer.volume);
float progress = avAudioPlayer.currentTime/avAudioPlayer.duration;
[progressV setProgress:progress];
int playedTime = (int)avAudioPlayer.currentTime;
int second = (playedTime%3600)%60;
int minute = (playedTime%3600)/60;
playTime.text =[ NSString stringWithFormat:@"%02d:%02d",minute,second];
}
-(void)Play{
if(![avAudioPlayer isPlaying]){
[avAudioPlayer play];
myTimer.fireDate = [NSDate distantPast];
}
}
-(void)Pause{
if([avAudioPlayer isPlaying]){
[avAudioPlayer pause];
myTimer.fireDate = [NSDate distantFuture];
}
}
//other method...
@end
时间暂停和恢复功能:
myTimer.fireDate = [NSDate distantFuture];//恢复
myTimer.fireDate = [NSDate distantPast];//暂停
done!!