我有一个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()
把你的UI放在后台线程中,肯定会让你的应用崩溃。我不知道为什么你的UICollectionView加载和设置你的中间广告会产生冲突而崩溃。但如果这是真的。尝试在一段时间后设置你的广告。像这样。
DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 2) { [ weak self] in
// TODO: Setup your ads here
}
这里是文档,如果需要的话。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))")
}
}