按顺序执行未知数量的动画

Performing an unknown amount of animations sequentially

我正在创建一个游戏,用户可以在其中移动 SKShapeNode。现在,我正在尝试编写一个实用函数,它将按顺序执行背靠背动画。

我正在尝试的描述

我先dispatch_async给一个串口线程。然后该线程在主线程上调用 dispatch_sync 来执行动画。现在,为了按顺序制作动画 运行,我想阻塞 GlobalSerialAnimationQueue 直到动画在主线程上完成。通过这样做,我(理论上)将能够按顺序 运行 动画。下面粘贴了我的代码以获取更多说明

func moveToCurrentPosition() {
    let action = SKAction.moveTo(self.getPositionForCurrRowCol(), duration: 1.0)
    dispatch_async(GlobalSerialAnimateQueue) {
        //this just creates an action to move to a point
        dispatch_sync(GlobalMainQueue, { 
            self.userNode!.runAction(action) {
                //inside the completion block now want to continue
                //WOULD WANT TO TRIGGER THREAD TO CONTINUE HERE
            }
        })
        //WOULD LIKE TO PAUSE HERE, THIS BLOCK FINISHING ONLY WHEN THE ANIMATION IS COMPLETE
    }
}

所以,我的问题是,我将如何编写一个函数来接受动画请求,然后按顺序执行它们?我应该使用什么 grand-central-dispatch 工具,或者我应该尝试一种完全不同的方法?

我想出了如何使用 grand-central-dispatch 信号量来做到这一点。我更新的代码在这里。

func moveToCurrentPosition() {

    let action = SKAction.moveTo(self.getPositionForCurrRowCol(), duration: Animation.USER_MOVE_DURATION)
    dispatch_async(GlobalSerialAnimateQueue) {
        let semaphore = dispatch_semaphore_create(0)
        dispatch_sync(GlobalMainQueue, {
            self.userNode!.runAction(action) {
                //signal done
                dispatch_semaphore_signal(semaphore)
            }
        })
        //wait here...
        dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER)
    }
}

SpriteKit 为 运行 动作顺序提供了更简单直观的 API。查看文档 here.

您可以简单地将操作作为一系列事件执行,中间有块或完成:

let action = SKAction.moveTo(self.getPositionForCurrRowCol(), duration: Animation.USER_MOVE_DURATION)

let otherAction = SKAction.runBlock({ 
            //Perform completion here.
        })

self.userNode!.runAction(SKAction.sequence([action, otherAction]))