在处理ActionBlock之前,先检查是否存在未处理的动作队列。下面是使用Swift的示例代码:
class ActionBlockRunner {
var actionBlock: (() -> Void)?
var actionsQueue: [() -> Void] = []
func perform(action: @escaping () -> Void) {
actionsQueue.append(action)
runNextAction()
}
private func runNextAction() {
if actionBlock == nil && !actionsQueue.isEmpty {
actionBlock = actionsQueue.removeFirst()
actionBlock?()
actionBlock = nil
runNextAction()
}
}
}
使用此类,每当需要执行一个动作时,应调用perform(action:)
方法。如果ActionBlock当前无法执行动作,则将其添加到未处理的动作队列中。然后,如果ActionBlock未被占用,则从队列中获取下一个待处理的动作并立即执行。设置actionBlock为nil表示ActionBlock可以接受新的动作执行请求。通过递归调用runNextAction()
方法,我们可以成功处理整个动作队列。