gpt4 book ai didi

ios - 我应该写什么完成处理程序?

转载 作者:搜寻专家 更新时间:2023-11-01 07:02:10 25 4
gpt4 key购买 nike

刚刚学习了如何创建completion handlers,大体上理解了它们,但我不知道如何将这些想法付诸实践来完成我需要的东西。

我有以下通用代码和 Storyboard结构:sessionVC(一个 UIViewController)及其 UIView 包含一个容器 View ,其中嵌入了到 animationVC(也是一个 UIViewController)及其 SKView 的转场。

从 sessionVC 我想在 animationVC 的 SKView 中运行一系列动画。我想尽快准备每个动画(例如,当每个先前的动画仍在运行时),并且我希望每个动画在开始之前等待最后一个动画完成。请参阅下面的代码。

我的问题是,我应该用什么来代替我的代码中的 ??? 来实现我想要的效果(如上所述,以及代码注释中每个 *** 之后)?

// TO DELEGATE ANIMATION TO animationVC
protocol AnimateContentDelegate: AnyObject {

prepareContent(_ Content, contentWasPrepared: ???)
animateContent(animationDidComplete: ???)
playAnimation()
pauseAnimation()
}

// CONTROL THE OVERALL SESSION
class sessionVC: UIViewController {

// INITIALIZE contentArray

weak var delegate: AnimateContentDelegate?

override func viewDidLoad {
super.viewDidLoad()

delegate = self.childViewControllers[0] as? AnimateContentDelegate

runSession(contentArray)
}

func runSession(_ contentArray) {

for content in contentArray {

delegate?.prepareContent(content, contentWasPrepared: ???)

// ***DON’T START THE NEXT ANIMATION UNTIL contentWasPrepared
// DO CONTINUE THE CURRENT ANIMATION, AND ALLOW INTERACTIONS

delegate?.animateContent(animationDidComplete: ???)

// ***DON’T START THE NEXT ANIMATION UNTIL animationDidComplete
// DO CONTINUE THE CURRENT ANIMATION, AND ALLOW INTERACTIONS
}
}

@IBAction func playOrPause(_ sender: UILongPressGestureRecognizer) {

if sender == .possible || sender.state == .ended {

delegate?.playAnimation()

} else if sender.state == .began {

delegate?.pauseAnimation()
}
}
}

// PREPARE AND ANIMATE CURRENT CONTENT
class animationVC: UIViewController, AnimateContentDelegate {

// SET UP SKVIEW

func prepareContent(_ content: Content, prepCompleteHandler: ???) {
// PREPARE THE CONTENT
// ***REPORT WHEN IT IS FINISHED
}

func animateContent(animationCompleteHandler: ???) {
// ANIMATE THE CONTENT
// ***REPORT IF IT RAN TO COMPLETION
}

func playAnimation() {
skView?.scene?.isPaused = false
}

func pauseAnimation() {
skView?.scene?.isPaused = true
}
}

最佳答案

按照通常的约定,您将使用稍微不同的措辞声明函数:

prepareContent(_ Content, completionHandler: { () -> Void })
animateContent(completionHandler: { () -> Void })

然后,在 SET UP SKVIEW 下面,您可以这样调用委托(delegate)函数:

delegate?.prepareContent(content, completionHandler: {
self.delegate.animateContent(completionHandler: {
// do whatever needs to be done upon completion
})
})

(您也可以使用尾随闭包语法。)通过像这样嵌套委托(delegate)调用,您可以确保仅在准备完成后才执行动画。

函数体看起来像这样:

func prepareContent(_ content: Content, completionHandler: (() -> Void)) {
// ...
completionHandler()
}

func animateContent(completionHandler: (() -> Void)) {
// ...
completionHandler()
}

如果你更喜欢有可选的完成处理程序,我。 e.那些可以为零的,像这样改变函数:

func prepareContent(_ content: Content, completionHandler: (() -> Void)?) {
// ...
completionHandler?()
}

关于ios - 我应该写什么完成处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50530848/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com