如何使用Swift 3 DispatchQueue有效地安排数千个异步事件

时间:2016-11-09 16:21:12

标签: ios swift swift3 grand-central-dispatch

我使用以下代码每0.1秒移动1米的地图标记:

    for index in 1 ... points.count - 1 {

        DispatchQueue.main.asyncAfter(deadline: .now() + 0.1 * Double(index)) {
            self.driverMarker.position = points[index]
            self.driverMarker.map = self.mapView
        }

    }

如果所有点的距离都是3000米,那么我设置设置3000 asyncAfters,我担心这是低效的。

有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

根据您在问题和评论中提出的要求,我认为使用DispatchSourceTimer更适合此任务。我提供了一个示例代码供以下参考。

var count = 0
var bgTimer: DispatchSourceTimer?

func translateMarker() {
    if count == (points.count - 1) {
        bgTimer?.cancel()
        bgTimer = nil
        return
    }
    self.driverMarker.position = points[index]
    self.driverMarker.map = self.mapView
    count += 1
}

override func viewDidLoad() {
    super.viewDidLoad()

    let queue:DispatchQueue = DispatchQueue.global(qos: DispatchQoS.QoSClass.default)

    bgTimer = DispatchSource.makeTimerSource(flags: [], queue: queue)
    bgTimer?.scheduleRepeating(deadline: DispatchTime.now(), interval: 0.1)

    bgTimer?.setEventHandler(handler: {
        self.translateMarker()
    })

    bgTimer?.resume()
}

如果您在实施此问题时遇到任何问题,请与我们联系。随意建议编辑以使其更好:)