如何使计时器正确计算AVAudioPlayer.duration?

时间:2016-12-11 08:28:03

标签: objective-c xcode nstimer

- (void)timerTickPlayer:(NSTimer*)timer 
{
    timeSec = 0;
    timeMin = 0;
    timeSec++;

    int displayTime = [[NSNumber numberWithFloat:player.duration]    intValue];

    if (timeSec == displayTime)
    {
        timeSec = 0;
        [timer invalidate];
    }

    NSString* playerTime = [NSString stringWithFormat:@"%2d",timeSec];
    labelTime.text = playerTime;
}

以上是我尝试让计时器从00开始计数的方法, 直到达到持续时间。

但事实证明,标签只会显示片刻的持续时间,然后再次变回00.

我的代码/逻辑问题在哪里?

这是最新情况!

哈哈,还有一个bug,似乎已经解决了。

latest one

1 个答案:

答案 0 :(得分:1)

使用AVPlayer,无需计时器:

${param.key}

回答ChiHsi Chung提出的额外问题:

  1. 根据documentation of addPeriodicTimeObserverForInterval:queue:usingBlock:

    需要弱自我
      

    重要

         

    您应该在回调块中使用弱引用来防止创建保留周期。

  2. 您需要创建自己的// timescale of 600 to report changes every 1/600th of a second (value taken from the doc of CMTimeScale) CMTime interval = CMTimeMakeWithSeconds(1, 600) __weak typeof(self) weakSelf = self; self.timeObserver = [player addPeriodicTimeObserverForInterval:interval queue:NULL usingBlock: ^(CMTime time) { int timeSec = (int)CMTimeGetSeconds(time); NSString *playerTime = [NSString stringWithFormat:@"%2d", timeSec]; weakSelf.labelTime.text = playerTime; }]; 属性timeObserver,以存储id的返回值。不,没有类型,因为根据定义,addPeriodicTimeObserverForInterval:queue:usingBlock:应该是:

      

    作为参数传递给timeObserver取消观察的不透明对象。