我们效仿谷歌在TableView中的广告:
将谷歌广告整合到iOS项目中。当我们使用演示广告单元id(/6499/例/横幅)时,一切都很好。
然而,当我们切换到制作广告时,我们的设备开始过热,应用程序明显滞后。
广告显示在集合视图中。我们用Google的例子来缓存广告
class AdvertisementManager{
static let TAG_A = 1
static let TAG_B = 2
static let TAG_C = 3
static let TAG_D = 4
static let TAG_E = 5
static let TAG_F = 6
// .............
}
struct GoogleAdvertisementMetadata {
weak var delegate: GADBannerViewDelegate?
weak var adSizeDelegate: GADAdSizeDelegate?
weak var rootViewController: UIViewController?
let validAdSizes: AdSizesOption
let targetingMetadata: AdTargetingMetadata
}
private func preLoadAdvertisements() {
let targetingVals = interactor?.getTargetingValues()
let targetingMetadata = AdTargetingMetadata(targetingValues: targetingVals)
let googleAdvertisementMetadata = GoogleAdvertisementMetadata(
delegate: self,
adSizeDelegate: self,
rootViewController: attachedView,
validAdSizes: advertisementSizes,
targetingMetadata: targetingMetadata)
googleMetadata = googleAdvertisementMetadata
cachedAdvertisements.removeAll()
cachedAdvertisements =
advertisementManager.createAdvertismentsForSections(googleAdvertisementMetadata)
}
func createAdvertismentsForSections(_ googleAdvertisementMetadata: GoogleAdvertisementMetadata) -> [String: GAMBannerView] {
var cachedAdvertisements: [String: GAMBannerView] = [:]
let adA = AdvertisementConstants.FeedAdvertisementSectionA
let adB = AdvertisementConstants.FeedAdvertisementSectionB
let adC = AdvertisementConstants.FeedAdvertisementSectionC
let adD = AdvertisementConstants.FeedAdvertisementSectionD
let adE = AdvertisementConstants.FeedAdvertisementSectionE
cachedAdvertisements[adA + "\(tagA)"] = createAdvertisement(with: adA, tag: tagA, metadata: googleAdvertisementMetadata)
cachedAdvertisements[adB + "\(tagB)"] = createAdvertisement(with: adB, tag: tagB, metadata: googleAdvertisementMetadata)
cachedAdvertisements[adC + "\(tagC)"] = createAdvertisement(with: adC, tag: tagC, metadata: googleAdvertisementMetadata)
cachedAdvertisements[adD + "\(tagD)"] = createAdvertisement(with: adD, tag: tagD, metadata: googleAdvertisementMetadata)
cachedAdvertisements[adE + "\(tagE)"] = createAdvertisement(with: adE, tag: tagE, metadata: googleAdvertisementMetadata)
return cachedAdvertisements
}
private func createAdvertisement(with adID: String, tag: Int, metadata: GoogleAdvertisementMetadata) -> GAMBannerView {
let view = GAMBannerView(adSize: GADAdSizeMediumRectangle)
view.adUnitID = adID
view.tag = tag
view.delegate = metadata.delegate
view.adSizeDelegate = metadata.adSizeDelegate
view.rootViewController = metadata.rootViewController
view.validAdSizes = getAdSizes(sizeOption: metadata.validAdSizes)
let request = GAMRequest()
request.customTargeting = AdTargetingManager().makeCustomAdTargetingDictionary(metadata: metadata.targetingMetadata)
view.load(request)
return view
}
func setupAdvertisements() {
datasource = datasource.filter({($0 as? AdvertisementCellConfigurator) == nil})
let adA = AdvertisementModel(adId: AdvertisementConstants.FeedAdvertisementSectionA, tagCell: AdvertisementManager.TAG_A)
let adB = AdvertisementModel(adId: AdvertisementConstants.FeedAdvertisementSectionB, tagCell: AdvertisementManager.TAG_B)
let adC = AdvertisementModel(adId: AdvertisementConstants.FeedAdvertisementSectionC, tagCell: AdvertisementManager.TAG_C)
let adD = AdvertisementModel(adId: AdvertisementConstants.FeedAdvertisementSectionD, tagCell: AdvertisementManager.TAG_D)
let adE = AdvertisementModel(adId: AdvertisementConstants.FeedAdvertisementSectionE, tagCell: AdvertisementManager.TAG_E)
datasource.addAdvertisments(firstAdPosition: 3, frequency: 5, ads: [adA, adB, adC, adD, adE])
let adCount = datasource.count(where: {$0 is AdvertisementCellConfigurator})
if adCount > AdvertisementManager.TAG_E {
datasource = datasource.filter({($0 as? AdvertisementCellConfigurator) == nil})
var advertisements = [adA, adB, adC, adD, adE]
for counter in (AdvertisementManager.TAG_E + 1)...adCount {
let adE = AdvertisementConstants.FeedAdvertisementSectionE
advertisements.append(AdvertisementModel(adId: adE, tagCell: counter))
if counter > cachedAdvertisements.count {
cachedAdvertisements[adE + "\(counter)" ] = advertisementManager.requestRepeatingAdvertisement(with: adE, metadata: googleMetadata)
}
}
datasource.addAdvertisments(firstAdPosition: 3, frequency: 5, ads: advertisements)
}
}发布于 2022-07-31 10:30:44
滚动时缓存广告,意味着在滚动的同时不断增加应用程序的内存占用。
你应该尝试一个临时解决方案。尝试只缓存不同的广告。例如,缓存广告从A到E,那么您应该利用集合视图的重用机制。例如,标记带有布尔值并防止重新加载广告的广告。
缓存应该如下所示,请按照google的演示(您不必使用标记,只需将视图缓存在字典中):
let cache = [AdvertismentA, AdvertismentB, AdvertismentC, AdvertismentD, AdvertismentE]var hasLoaded: [GADBannerView: Bool]
注意:collectionView手机不应该打网络电话,因为你会被谷歌禁止。
如果用户从AdvertisementE 进一步滚动,请不要使用
overloading)
只需显示带有广告的重用集合视图单元格即可。
https://stackoverflow.com/questions/72262463
复制相似问题