在swift中进行民意调查的正确方法是什么?

时间:2017-06-05 11:32:20

标签: swift grand-central-dispatch polling

我对其他编程语言有很多经验,但在swift 3中没那么多。我想做轮询循环。这就是我写的:

DispatchQueue.global(qos: .userInitiated).async {
            [unowned self] in
            while self.isRunning {
                WebService.getPeople(completion: nil)
                sleep(100)
            }
        }

这对我来说很好,每100秒,我做一次轮询,然后让这个线程睡觉。我想知道的是,这是在swift 3中这样做的正确方法吗?

2 个答案:

答案 0 :(得分:5)

您有两个选择:

  • 使用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()

leeway参数是系统推迟计时器的时间。

答案 1 :(得分:0)

Swift 5,iOS 10.0+

接受的答案中的代码不再编译,可以修改(和简化!)为:

DispatchQueue.global(qos: .userInitiated).async {
    let timer = Timer.scheduledTimer(withTimeInterval: 100, repeats: true) { timer in
        // Your action
    }
    timer.fire()
}