我如何强制 UI 在 Swift 中更新?

How can I force UI updated in Swift?

我正在使用swift开发一款国际象棋游戏。当计算机自己玩游戏时,当移动完成时显示不会更新,直到它退出循环(在这种情况下游戏结束)。

我尝试在后台队列中调度它以生成移动并将其调度回主队列以进行移动并更新显示。虽然它似乎有助于更新显示,但我无法预测每个后台队列的完成情况。这打乱了动作的顺序。

有没有更好的方法让电脑自己玩,并在每次移动完成后正确更新显示?

while chessGame.checkmate != true {
    DispatchQueue.global(qos: .background).async {
        let bestMove = chessAI.findBestMove(depth : chessGame.searchDepth)
        if bestMove != nil {
            DispatchQueue.main.asyncAfter(deadline: DispatchTime.now()) {
                chessMove.makeMove(m : bestMove!)
                self.boardView.setNeedsDisplay()
            }
        } else {
            print("CheckMate!")
            chessGame.checkmate = true
        }
    }
}

可以立即强制显示(通过调用displayIfNeeded),但这无济于事。

问题是 while 循环不会在迭代之间暂停:它只是保持以最快的速度循环。因此 while 循环是一个糟糕的策略。

而是使用递归。这使您可以控制何时进行下一次迭代,即在延迟后递归。这是一个循环,您可以在迭代之间暂停。

伪代码:

func nextMove() {
    DispatchQueue.global(qos: .background).async {
        let bestMove = chessAI.findBestMove(depth : chessGame.searchDepth)
        if bestMove != nil {
            DispatchQueue.main.asyncAfter(deadline: .now() + 3) { // or whatever
                chessMove.makeMove(m : bestMove!)
                self.boardView.setNeedsDisplay()
                if chessGame.checkmate != true {
                    nextMove()
                } else {
                    print("checkmate")
                }
            }
        }
    }
}