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