Как предотвратить ошибку sh при закрытии межстраничного объявления при изменении основного пользовательского интерфейса? - PullRequest
0 голосов
/ 27 мая 2020

У меня есть приложение Swift, которое показывает межстраничные объявления, когда я его открываю. В то же время я загружаю вызов, чтобы показать список ответов объектов с сервера в UICollectionView.

Иногда, если элементы в UICollectionView загружаются одновременно с закрытием межстраничного объявления, мое приложение cra sh. Это происходит потому, что основной поток вызывается из межстраничного объявления и загрузки UICollectionView ...

Как я могу предотвратить это? Некоторые идеи?

Я попытался добавить межстраничное объявление в фоновый поток, но, очевидно, не работает.

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

Библиотека для загрузки insterstitial - это Smart Ad Server:

И мой код:

let sasAdPlacement: SASAdPlacement = SASAdPlacement(siteId: myId, pageId: myId, formatId: myId)
sasInterstitial = SASInterstitialManager(placement: sasAdPlacement, delegate: self)
sasInterstitial.load()

Ответы [ 2 ]

0 голосов
/ 09 июня 2020

Вот документация, если необходимо: http://documentation.smartadserver.com/displaySDK/ios/integration/interstitial.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))")
    }
}
0 голосов
/ 28 мая 2020

Поместите свой пользовательский интерфейс в фоновый поток, безусловно, это приведет к сбою вашего приложения. Я не знаю, почему загрузка и настройка межстраничных объявлений UICollectionView может вызвать конфликт и сбой. Но если это правда. Попробуйте настроить рекламу через некоторое время. Примерно так:

DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 2) { [ weak self] in
            // TODO: Setup your ads here
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...