You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Xcode中如何多次运行函数?如何在游戏结束场景触发插屏广告?

嘿,针对你提出的两个问题,我来给你梳理下具体的解决办法:

1. 如何在Xcode中多次运行函数?

在Xcode里重复执行函数,得看你的使用场景(普通iOS应用还是SpriteKit游戏),这里给你几个实用方案:

  • 循环直接调用:如果是一次性重复固定次数,用for循环最直接:
    func myRepeatingFunction() {
        print("函数执行了一次")
    }
    
    // 重复执行5次
    for _ in 0..<5 {
        myRepeatingFunction()
    }
    
  • 定时器(Timer):如果需要每隔一段时间执行一次,比如每隔2秒跑一次,Timer是不错的选择:
    var repeatTimer: Timer?
    
    func startRepeating() {
        // 每隔2秒执行一次myRepeatingFunction,持续重复
        repeatTimer = Timer.scheduledTimer(timeInterval: 2.0, target: self, selector: #selector(myRepeatingFunction), userInfo: nil, repeats: true)
    }
    
    @objc func myRepeatingFunction() {
        print("定时执行函数")
    }
    
    // 记得不需要时销毁定时器,避免内存泄漏
    func stopRepeating() {
        repeatTimer?.invalidate()
        repeatTimer = nil
    }
    
  • GCD重复任务:如果需要更精准的定时或后台执行,用GCD的重复调度更可靠:
    var repeatTask: DispatchSourceTimer?
    
    func startGCDRepeating() {
        let queue = DispatchQueue.global()
        repeatTask = DispatchSource.makeTimerSource(queue: queue)
        repeatTask?.schedule(deadline: .now(), repeating: .seconds(2))
        repeatTask?.setEventHandler { [weak self] in
            self?.myRepeatingFunction()
        }
        repeatTask?.resume()
    }
    
    func myRepeatingFunction() {
        print("GCD定时执行函数")
    }
    
    // 停止任务
    func stopGCDRepeating() {
        repeatTask?.cancel()
        repeatTask = nil
    }
    
  • SpriteKit场景的update方法:如果是游戏场景(比如你提到的GameOverScene),可以利用SKScene的update(_:)方法,它每帧都会执行,适合游戏内的重复逻辑:
    class MyGameScene: SKScene {
        override func update(_ currentTime: TimeInterval) {
            // 每帧都会执行这里的代码,相当于重复运行
            myGameFunction()
        }
    
        func myGameFunction() {
            // 游戏相关的重复逻辑
        }
    }
    
2. 在GameOverScene中加载插屏广告的解决方案

你提到没法直接在viewDidLoad调用广告函数,其实SpriteKit场景的生命周期和UIViewController不同,viewDidLoad是VC的方法,SKScene对应的场景就绪回调是didMove(to:)——当玩家进入GameOverScene时,这个方法会被触发,刚好符合你的需求。这里给你两种靠谱方案:

方案一:直接在didMove(to:)中调用广告函数

这是最简单直接的方式,didMove(to:)就是场景完全就绪后的触发点,完美匹配“玩家进入场景时运行广告函数”的需求:

class GameOverScene: SKScene {
    override func didMove(to view: SKView) {
        super.didMove(to: view)
        // 在这里调用插屏广告的加载/展示逻辑
        loadAndShowInterstitialAd()
    }

    func loadAndShowInterstitialAd() {
        // 按照广告SDK的要求实现加载和展示逻辑
        // 比如先预加载(建议在游戏过程中提前加载,进入场景直接展示),再调用展示方法
        // interstitialAd.load()
        // if interstitialAd.isReady { interstitialAd.present(fromRootViewController: ...) }
    }
}

小提示:为了避免玩家等待,建议在玩家即将死亡前就预加载广告,进入GameOverScene时直接展示,体验更好。

方案二:布尔变量配合update方法(优化你的思路)

如果你确实需要用update方法控制,也可以优化你的思路,避免每帧重复判断浪费性能:

class GameOverScene: SKScene {
    var shouldShowInterstitial = false

    override func didMove(to view: SKView) {
        super.didMove(to: view)
        // 标记需要展示广告
        shouldShowInterstitial = true
    }

    override func update(_ currentTime: TimeInterval) {
        super.update(currentTime)
        guard shouldShowInterstitial else { return }
        
        // 执行广告逻辑
        loadAndShowInterstitialAd()
        // 执行后把变量设为false,避免重复执行
        shouldShowInterstitial = false
    }

    func loadAndShowInterstitialAd() {
        // 广告逻辑实现
    }
}

这种方式适合广告依赖场景某些初始化状态的情况,但大部分场景下,didMove(to:)已经足够满足需求。

另外要注意:如果广告SDK要求在主线程操作,记得把广告代码包在DispatchQueue.main.async里,避免线程问题。

内容的提问来源于stack exchange,提问作者Nawab Hussaunnawab

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:29:06