如何防止在主界面变化的时候,中间插播广告被驳回时的崩溃?

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

我有一个Swift应用程序,当我打开这个应用程序时,显示Interstitial广告。同时,我加载了一个调用来显示来自服务器的对象的响应列表到一个UICollectionView中。

有时,如果在关闭interstitial的同时加载UICollectionView中的项目,我的应用程序就会崩溃。这是因为主线程从中间休息和UICollectionView加载时被调用。

我怎样才能防止这种情况发生?有什么好办法?

我试过将中间体添加到后台线程中,但显然是行不通的。

DispatchQueue.global(qos: .background).async {
}

加载interstitial的库是Smart Ad Server。

而我的代码是:

let sasAdPlacement: SASAdPlacement = SASAdPlacement(siteId: myId, pageId: myId, formatId: myId)
sasInterstitial = SASInterstitialManager(placement: sasAdPlacement, delegate: self)
sasInterstitial.load()
ios swift multithreading uicollectionview interstitial
1个回答
0
投票

把你的UI放在后台线程中,肯定会让你的应用崩溃。我不知道为什么你的UICollectionView加载和设置你的中间广告会产生冲突而崩溃。但如果这是真的。尝试在一段时间后设置你的广告。像这样。

DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 2) { [ weak self] in
            // TODO: Setup your ads here
}

0
投票

这里是文档,如果需要的话。http:/documentation.smartadserver.comdisplaySDKiosintegrationinterstitial.html。

我想你会发现你的解决方案是将委托与DispatchQueue结合起来使用。

DispatchQueue(label: "interstitial", qos: .userInitiated, attributes: .concurrent, autoreleaseFrequency: .workItem, target: DispatchQueue.main).async {
    sasInterstitial.load()
}

所以,请你试试

class InterstitialViewController: UIViewController, SASInterstitialManagerDelegate {

   func viewDidLoad() {
       super.viewDidLoad()
       showInterstitial(withPageID: 1234, formatID: "XYZ", debug: true)        
    }

    // MARK: - SASInterstitial

    func showInterstitial(withPageID pageID: Int, formatID: String, debug: Bool = false) {

        let adPlacement = SASAdPlacement(siteId: "xxxxxxxx", pageId: pageID, formatId: formatID)
        let placement = debug ? SASAdPlacement(testAd: .inAppBiddingInterstitial) : adPlacement
        let interstitialManager = SASInterstitialManager(placement: placement, delegate: self)

        DispatchQueue(label: "interstitial", qos: .userInitiated, attributes: .concurrent, autoreleaseFrequency: .workItem, target: DispatchQueue.main).async {
            interstitialManager.load()
        }

    }

    // MARK: - SASInterstitial delegate

    func interstitialManager(_ manager: SASInterstitialManager, didLoad ad: SASAd) {
        print("Interstitial has been loaded")
        manager.show()
    }

    func interstitialManager(_ manager: SASInterstitialManager, didAppearFrom controller: UIViewController) {
        print("Interstitial is presenting")
    }

    func interstitialManager(_ manager: SASInterstitialManager, didFailToLoadWithError error: Error) {
        print("Interstitial has failed to load with error: \(error.localizedDescription)")
    }

    func interstitialManager(_ manager: SASInterstitialManager, didFailToShowWithError error: Error) {
        print("Interstitial has failed to show with error: \(error.localizedDescription))")
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.