2016-02-12 54 views
0

我需要在特定的秒数内每0.1秒调用一次函数。直接秒数创建nstimer

我试图通过创建两个NSTimers来实现这一目标:

cameraLocalTimer = NSTimer.scheduledTimerWithTimeInterval(0.1, target: self, selector: "performStep", userInfo: nil, repeats: true) 
cameraGlobalTimer = NSTimer.scheduledTimerWithTimeInterval(5.0, target: self, selector: "captureShouldEnd", userInfo: nil, repeats: false) 

然后,我实现了自己的功能是这样的:

var stepCounter = 0 
func performStep() { 
    stepCounter++ 
    print(stepCounter) 
} 

func captureShouldEnd() { 
    cameraGlobalTimer.invalidate() 
    cameraLocalTimer.invalidate() 
    stepCounter = 0 
} 

但是当我运行我的应用程序在日志中看到该cameraLocalTimer被调用47次,而不是50.

有人可以帮我解决我的问题或建议更好的方法来做到这一点?

回答

1

如果你想达到这个高精度水平,NSTimer是不够的。根据NSTimer的文档:

定时器不是实时机制;只有在添加了定时器的运行循环模式之一运行并且能够检查定时器的触发时间是否已过时,它才会触发。由于典型的运行循环管理各种输入源,所以定时器的时间间隔的有效分辨率被限制在50-100毫秒的量级上。

这意味着你可能跳过一拍。为了获得更高的精度,我建议你看看CADisplayLink,这是一个较低级别的功能,可以进入屏幕刷新率,并为您提供一个可用于运行计算的时间戳。话虽如此,保真度将始终取决于您的屏幕刷新率。

+0

其实我有设置我的计时器后,这行代码: 'cameraLocalTimer = NSTimer.scheduledTimerWithTimeInterval(arrowStepSeconds,目标:自我,选择: “performStep”,用户信息:无,重复:真) cameraGlobalTimer = NSTimer.scheduledTimerWithTimeInterval (cameraCaptureSeconds,目标:自,选择器: “captureShouldEnd”,用户信息:无,重复:假) AudioServicesPlaySystemSound(beginRecordingSoundID) assetWriter.startWriting() assetWriter.startSessionAtSourceTime(kCMTimeZero) captureStarted = TRUE' 我试图创建没有这些线路和定时器触发50次的测试项目。 – mikle94

+0

所以我只是把该代码之后的计时器创建,它没关系 – mikle94