简体   繁体   English

如何在Swift中逐点绘制线

[英]How to draw line point by point in Swift

I realised that I'm misusing the data retrived from the server in my tracker app. 我意识到自己在跟踪器应用程序中滥用了从服务器检索的数据。 So I have this: 所以我有这个:

 @objc private func updateOnlineTrackWithNewData() {

    print("Tick")

    if let track = track {

        guard track.status == 1 else { return } // is track online?

        serverManager.tracks.updateOnlineTrack(for: track, success: { (trackNewPoints) in 
       //receive new data

            guard trackNewPoints.count > 1 else { return }

            for point in trackNewPoints {

                self.track?.points?.append(point)

                self.performSelector(onMainThread: #selector(self.updateOnlineTrackOnMap), with: nil, waitUntilDone: true)

            }

        }) { (error) in

            print(error ?? "Error updating online track")

           }
    }
}

Where trackNewPoints is basically an array of points that I'm appending to the main "track" and updateOnlineTrackOnMap is just printing it out. trackNewPoints基本上是我要附加到主“ track”上的点的数组,而updateOnlineTrackOnMap只是将其打印出来。 updateOnlineTrackWithNewData() function is triggered by timer, everything works correctly. updateOnlineTrackWithNewData()函数由计时器触发,一切正常。 But I want to draw line point by point to simulate realtime movement. 但是我想逐点绘制线以模拟实时运动。 How can I achieve that? 我该如何实现? performSelector doesn't seem to work. performSelector似乎不起作用。

Every 10 seconds I have 10 new points or so if that helps. 如果有帮助,每10秒我会获得10个新点。

There is one way to do it. 有一种方法可以做到这一点。 Create separate class Drawer 创建单独的类抽屉

protocol Drawable { // add to your controller 
    func appendPoint(_ point: AnyObject)
    func updateOnlineTrackOnMap()
}

class Drawer {

    private var timer: Timer? = nil
    private var points: [AnyObject] = []

    func drawPoints(_ points: [AnyObject],
                    controller: Drawable) {
        self.points = points
        timer = Timer.scheduledTimer(withTimeInterval: 1, repeats: true) { [weak self] timer in
            guard let point = self?.points.first else {
                timer.invalidate()
                return
            }
            DispatchQueue.global(qos: .userInteractive).async {
                controller.appendPoint(point)
                controller.updateOnlineTrackOnMap()
                self?.points.remove(at: 0)
            }
        }
    }
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM