接上一篇簡單實現(xiàn):http://www.reibang.com/p/45796cf24ea4
這次要考慮的問題是:如果廣告是動態(tài)獲取的該如何處理蜗元?
1.先看需求:如果必須要等接口返回廣告地址并下載完廣告圖片才能進入APP,那就只能在AppDelegate做請求的同步,阻塞主線程等廣告加載完成顯示后才執(zhí)行后面的代碼
弊端:一般都不會這么處理,必須要考慮到用戶如果網(wǎng)絡(luò)慢的情況下會一直停留在啟動頁
2.對圖片做緩存:第一次進入APP只會下載遠程廣告圖片在本地窥摄,下次啟動再直接從緩存中讀取,這樣就可以排除掉網(wǎng)絡(luò)因素
弊端:實時性不強藕溅,如果更換廣告需要等到第二次啟動才會展示
可以根據(jù)實際情況做選擇询吴,一般都考慮第二種,畢竟廣告展示對用戶來說不那么重要
下面就按第二種方案來實現(xiàn):
#pragma mark 加載遠程廣告
- (void)loadAD {
//廣告url
NSString *adImageUrl = @"https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1486466389044&di=a7ab421bb82bd0d214bbdc5a6b79f2bf&imgtype=0&src=http%3A%2F%2Fpic.qiantucdn.com%2F58pic%2F17%2F80%2F57%2F94s58PICA7j_1024.jpg";
//點擊跳轉(zhuǎn)地址
NSString *adImagePushUrl = @"https://www.baidu.com/";
SDWebImageManager *sdmanage = [SDWebImageManager sharedManager];
NSURL *adUrl = [NSURL URLWithString:adImageUrl];
//url是否已被緩存
if ([sdmanage diskImageExistsForURL:adUrl]) {
UIImage *startADImage = [sdmanage.imageCache imageFromDiskCacheForKey:adImageUrl];
if (startADImage) {
//自定義廣告ImageView
ADImageView *launch = [[ADImageView alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
launch.image = startADImage;
//廣告點擊跳轉(zhuǎn)
launch.adPicTapClick = ^{
//這里是跳轉(zhuǎn)邏輯
};
//設(shè)置window層級
[self.window addSubview:launch];
}
}
else {
//異步下載并緩存以供下次直接讀取
[[SDWebImageManager sharedManager] downloadImageWithURL:adUrl options:0 progress:nil completed:^(UIImage *image, NSError *error, SDImageCacheType cacheType, BOOL finished, NSURL *imageURL) {}];
}
}
這里結(jié)合SDWebImage庫完成圖片的緩存
最終效果:
github完整Demo:
https://github.com/sg369326973/LoadADDemo