在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
相关产品推荐
相关产品推荐

