Dispatch Queue Swift出错

时间:2018-02-17 12:15:39

标签: swift dispatch-queue

我正在尝试创建一种用于在赛道上跑赛车的遗传算法。每辆车都会获得随机指令,这些指令会对汽车施加一定的力并将汽车旋转一定的度数。为了分配给每辆车的新指令,我在调度队列中使用了一个延迟时间,它为前一条指令增加了0.2秒。 例如

0秒 - 第一次指示
0.2秒 - 第二条指令
0.4秒 - 第三条指令

依旧......

我遇到的问题是,在执行了几条指令之后,我开始注意到指令之间的延迟时间更长,比如在2秒之后应用新指令。

以下是我的代码。

func carAction(newCar: [[CGFloat]], racecar: SKSpriteNode) {
        var caralive = true
        let max = 1000
        var count = 0
        let delayTime = 200000000
        var deadlineTime = DispatchTime.now()
        while count < max {
            let angleChange = newCar[count][1]
            let speedChange = newCar[count][0]
            count += 1
            deadlineTime = deadlineTime + .nanoseconds(delayTime)
            DispatchQueue.main.asyncAfter(deadline: deadlineTime) {
                if caralive == true {
                    print(DispatchQueue.main)
                    racecar.physicsBody?.angularVelocity = 0
                    let rotate = SKAction.rotate(byAngle: (angleChange * .pi / 180), duration: 0.2)
                    racecar.run(rotate)
                    let racecarRotation : CGFloat = racecar.zRotation
                    var calcRotation : Float = Float(racecarRotation) + Float(M_PI_2)
                    let Vx = speedChange * CGFloat(cosf(calcRotation))
                    let Vy = speedChange * CGFloat(sinf(calcRotation))
                    let force = SKAction.applyForce(CGVector(dx: Vx, dy: Vy), duration: 0.2)
                    racecar.run(force)
                    let total = self.outerTrack.count
                    var initial = 0
                    while initial < total {
                        if racecar.intersects(self.outerTrack[initial]) {
                            racecar.removeFromParent()
                            self.numberOfCars -= 1
                            initial += 1
                            caralive = false
                            break
                        } else {
                            initial += 1
                        }
                    }
                } else {
    //                print(self.numberOfCars)
                }
            }
        }

2D数组newCar是所有指令的列表。

任何帮助都会受到大力赞赏,因为我现在已经试图解决这个问题了!!

非常感谢,任何问题都可以随意提出!

1 个答案:

答案 0 :(得分:1)

你应该做这样的事情:

func scheduledTimerWithTimeInterval(){
    // Scheduling timer to Call the function "updateCounting" with the interval of 1 seconds
    timer = NSTimer.scheduledTimerWithTimeInterval(1, target: self, selector: Selector("moveCarsFunction"), userInfo: nil, repeats: true)
}

并致电scheduledTimerWithInterval一次

originally answered here