Meg*_*anX 3 polling grand-central-dispatch swift
我对其他编程语言有丰富的经验,但是对Swift 3则没有太多的经验。我想进行轮询循环。这是我写的:
DispatchQueue.global(qos: .userInitiated).async {
[unowned self] in
while self.isRunning {
WebService.getPeople(completion: nil)
sleep(100)
}
}
Run Code Online (Sandbox Code Playgroud)
这对我来说很好,每隔100秒进行一次轮询,然后使该线程休眠。我想知道的是,在Swift 3中执行此操作的正确方法是吗?
您有2个选择:
NSTimerDispatchSourceTimer使用NSTimer非常简单,但是它需要一个活动的运行循环,因此,如果需要轮询后台线程,则可能会有些棘手,因为您将需要创建一个线程并在其上保持运行循环(可能是计时器本身将使运行循环保持活动状态)。
DispatchSourceTimer另一方面使用queues。您可以轻松地从系统提供的队列之一创建调度源计时器,也可以创建一个。
var timer: DispatchSourceTimer?
let queue = DispatchQueue.global(qos: .background)
guard let timer = DispatchSource.makeTimerSource(queue: queue) else { return }
timer.scheduleRepeating(deadline: .now(), interval: .seconds(100), leeway: .seconds(1))
timer.setEventHandler(handler: {
// Your code
})
timer.resume()
Run Code Online (Sandbox Code Playgroud)
该leeway参数是时间,该系统可以推迟定时器量。