如何将 AdMob `GADFullScreenContentDelegate` 转换为 Swift 6 并发

问题描述 投票:0回答:1

这与如何将 `VNDocumentCameraViewControllerDelegate` 转换为 Swift 6 Concurrency 类似,但有一个警告是新的,因此可能需要不同的解决方案。

我有以下代码:

@MainActor
final class InterstitialWrapper: NSObject {
  ...
}

extension InterstitialWrapper: GADFullScreenContentDelegate {
  func ad(_ ad: GADFullScreenPresentingAd, didFailToPresentFullScreenContentWithError error: Error) {
    
  }
  ... 

我收到此错误:

主参与者隔离实例方法'ad(_:didFailToPresentFullScreenContentWithError:)'不能用于满足非隔离协议要求;这是 Swift 6 语言模式下的错误

然后我使用

@preconcurrency
标签:

extension InterstitialWrapper: @preconcurrency GADFullScreenContentDelegate

错误变为:

主参与者隔离实例方法“ad(_:didFailToPresentFullScreenContentWithError:)”满足的协议要求参数中的不可发送类型“任何 GADFullScreenPresentingAd”不能跨越参与者边界;这是 Swift 6 语言模式下的错误

然后我用

@preconcurrency import
:

@preconcurrency import GoogleMobileAds

然后我得到:

“GoogleMobileAds”模块上的“@preconcurrency”属性无效

我已经验证这是唯一导入的文件

GoogleMobileAds

请注意,这类似于 如何将 `VNDocumentCameraViewControllerDelegate` 转换为 Swift 6 Concurrency,但关于

Non-sendable type 'any GADFullScreenPresentingAd'
的警告是新的。而且它不是一个系统框架,而是一个第三方框架(admob)。所以我在这里创建一个新问题,以防解决方案不同。

ios swift concurrency admob swift6
1个回答
0
投票

在旧 API 更新为使用

MainActor
之前(我希望这就是您所要求的),您可以使用
assumeIsolated
。如果您不在
MainActor
中运行该函数,这会使您的应用程序崩溃(比没有注意到要好)。

nonisolated func ad(_ ad: GADFullScreenPresentingAd, didFailToPresentFullScreenContentWithError error: Error) {
  MainActor.assumeIsolated {
    //Code Goes here
  }
}
© www.soinside.com 2019 - 2024. All rights reserved.