【问题标题】:How to Efficiently Schedule Thousands of Async Events Using Swift 3 DispatchQueue如何使用 Swift 3 DispatchQueue 高效地调度数千个异步事件
【发布时间】:2016-11-09 16:21:12
【问题描述】:

我每 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/10 秒一个接一个?您应该询问解决您认为可以解决的问题的最佳方法。
  • 那么您是说要在一段时间内沿点路线为地图标记设置动画?
  • 是的,我想在 CLLocationCoordinates 的预定义路线上为地图标记设置动画。

标签: ios swift swift3 grand-central-dispatch


【解决方案1】:

根据您在问题和 cmets 中所述的要求,我相信使用 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()
}

如果您在实施时遇到任何问题,请告诉我。随时提出修改建议以使其更好:)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-04
    • 1970-01-01
    • 2018-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多