0

您好,每次我尝试用 CFAbsoluteTimeGetCurrent() 记录日期时;我的应用程序忽略了其余的按钮,就好像它接管了所有内存并阻止了所有用户输入。我想知道我做错了什么?我想制作一个函数 showtime() 但我不知道如何在函数之间传递从 toggleRecording 到 showtime 的值,这样如果这甚至可以解决问题,我的方法就可以工作。下面是我的代码:

- (IBAction)toggleRecording:(id)sender
{
    // Start recording if there isn't a recording running. Stop recording if there is.
    [[self recordButton] setEnabled:NO];
    if (![[[self captureManager] recorder] isRecording]){
        [[self captureManager] startRecording];

        /* figure out a day to record for every half a second
         while([[[self captureManager]recorder] isRecording]){
         CFTimeInterval startTime = CFAbsoluteTimeGetCurrent();
         NSLog(@" time is %i", startTime);
         }

        */
    }
    else
        [[self captureManager] stopRecording];


}

-(void)showtime:(id)sender{
    while([[[self captureManager]recorder] isRecording]){
        CFTimeInterval startTime = CFAbsoluteTimeGetCurrent();
        NSLog(@" time is %f", startTime);
    }
}
4

1 回答 1

2

应用程序必须运行事件循环才能接收事件。当您自己的代码在做其他事情时(这里它正在做一个“while”循环),事件会排队并且在您的代码返回之前不会传递。

从原理上讲,应用程序正在执行以下操作:

while(1) {
    event = _UIReceiveNextQueuedEvent();
    _UIProcessEvent(event); // <- this calls -showTime:
}

如果要在不阻塞循环的情况下记录时间,则必须NSTimer每 0.5 秒安排一次,并在记录关闭后立即使其无效。

就像是:

- (void)showTime:(id)sender
{
    if ([[[self captureManager]recorder] isRecording]) {
        [NSTimer scheduledTimerWithTimeInterval:0.5f target:self selector:@selector(timerFired:) userInfo:nil repeats:YES];
    }
}

- (void)timerFired:(NSTimer *)timer
{
    if ([[[self captureManager]recorder] isRecording]) {
        CFTimeInterval startTime = CFAbsoluteTimeGetCurrent();
        NSLog(@" time is %f", startTime);
    } else {
        [timer invalidate];
    }
}
于 2012-08-15T18:55:54.660 回答