在没有NSTimer的情况下制作Timer(swift)

时间:2014-09-20 00:55:11

标签: swift

是否可以在不使用NSTimer的情况下在Xcode 6中制作计时器?我的意思是你可以指定一个时间增量来重复一定数量的代码?或者添加是否可以制作一个NSTimer,它没有选择器选择不同的方法只是继续NSTimer实现的相同方法中的代码?

3 个答案:

答案 0 :(得分:1)

可以按照帖子中的描述构建方案。下面的代码显示了我在没有NSTimer的情况下模拟计时器的基本思路。请注意,默认情况下,代码使用NSThread,或者您可以将useGCD设置为使用GCD进行分派。

class Timer: NSObject {

    var interval = 1.0 // Interval at 1.0 second
    var useGCD = false // Set true to use GCD

    var _isTimerRunning = false

    func start() {
        if !_isTimerRunning {
            if !useGCD {
                var thread = NSThread(target: self, selector: Selector("timerFunction"), object: nil)
                thread.start()
            } else {
                var queue = dispatch_queue_create("com.example.threading", nil)
                dispatch_async(queue, {
                    self.timerFunction()
                })
            }
            _isTimerRunning = true
        }
    }

    func stop() {
        _isTimerRunning = false
    }

    func timerFunction() {
        while (_isTimerRunning) {
            /*
             * TO-DO Designated code goes here
             */
            NSThread.sleepForTimeInterval(interval) // Interrupt
        }
    }
}

启动计时器:

var timer = Timer()
timer.start()

此致

答案 1 :(得分:0)

你能使用延迟功能吗?设置在循环中以反复触发。

delay (5.0) {

//code to execute here

}

func delay(delay:Double, closure:()->()) {
        dispatch_after(
            dispatch_time(
                DISPATCH_TIME_NOW,
                Int64(delay * Double(NSEC_PER_SEC))
            ),
            dispatch_get_main_queue(), closure)
    }

答案 2 :(得分:0)

当然!我有一个为此目的而制作的Objective-c宏,可能会以某种方式快速移植。

#define startBlockTimer(delayInSeconds, block) {\
__block float runTime = (-1.0f*delayInSeconds);\
__block BOOL keepRunning = YES;\
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT,0), ^{ for(;keepRunning&&(runTime+=delayInSeconds);[NSThread sleepForTimeInterval:delayInSeconds]) {dispatch_async(dispatch_get_main_queue(), block );}});\
}
#define blockTimerRunTime runTime
#define stopBlockTimer() keepRunning = NO;

像这样使用:

startBlockTimer(0.5, ^{

        self.view.backgroundColor = [UIColor colorWithHue:arc4random_uniform(1000)/1000.0f saturation:0.75f brightness:0.75f alpha:1.0f];

        if (blockTimerRunTime > 5.0f) {
            stopBlockTimer();
        }

    });