正确进行快速轮询的方法?

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中执行此操作的正确方法是吗?

And*_*rea 6

您有2个选择:

  • 使用 NSTimer
  • 用一个 DispatchSourceTimer

使用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参数是时间,该系统可以推迟定时器量。