我们遵循 Google 在 TableView 中展示广告的示例:
在 iOS 项目上集成 google 广告。当我们使用演示广告单元 id(/6499/example/banner) 时,一切正常。
然而,当我们切换到制作广告时,我们的设备开始过热,并且应用程序明显滞后。
广告显示在集合视图中。我们以与 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)
}
}
Run Code Online (Sandbox Code Playgroud)
小智 1
滚动时缓存广告意味着滚动时您会不断增加应用程序的内存占用量。
您应该尝试临时解决方案。尝试仅缓存不同的广告。例如缓存从A到E的广告。那么你应该利用集合视图的重用机制。例如,标记已加载布尔值的广告并防止重新加载广告。
缓存应该如下所示,请仔细关注 google 的演示(您不必使用标签,只需将视图缓存在字典中):
let cache = [AdvertismentA, AdvertismentB, AdvertismentC, AdvertismentD, AdvertismentE]
Run Code Online (Sandbox Code Playgroud)
var hasLoaded: [GADBannerView: Bool]
注意:该collectionView单元不应进行网络调用,因为您将被谷歌禁止。
如果用户从AdvertisementE do not进一步滚动:
只需显示带有广告的重复使用的集合视图单元格即可。
| 归档时间: |
|
| 查看次数: |
296 次 |
| 最近记录: |