接上一篇简单实现:https://www.jianshu.com/p/45796cf24ea4
这次要考虑的问题是:如果广告是动态获取的该如何处理?
1.先看需求:如果必须要等接口返回广告地址并下载完广告图片才能进入APP,那就只能在AppDelegate做请求的同步,阻塞主线程等广告加载完成显示后才执行后面的代码
弊端:一般都不会这么处理,必须要考虑到用户如果网络慢的情况下会一直停留在启动页
2.对图片做缓存:第一次进入APP只会下载远程广告图片在本地,下次启动再直接从缓存中读取,这样就可以排除掉网络因素
弊端:实时性不强,如果更换广告需要等到第二次启动才会展示
可以根据实际情况做选择,一般都考虑第二种,毕竟广告展示对用户来说不那么重要
下面就按第二种方案来实现:
#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";
//点击跳转地址
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;
//广告点击跳转
launch.adPicTapClick = ^{
//这里是跳转逻辑
};
//设置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) {}];
}
}
这里结合SDWebImage库完成图片的缓存
最终效果:
未命名.gifgithub完整Demo:
https://github.com/sg369326973/LoadADDemo
网友评论