开发需求中, 产品经常希望知道列表中的某个元素是不是曝光了, 但是曝光的规则又会给的很复杂, 比如
- 页面出现且数据加载好 需要曝光
- 刷新页面 数据没变不曝光
- 进入下一个页面, 再回来, 曝光
- 滑动列表, 元素不可见, 然后滑回来, 又变的可见了, 需要曝光
- 退后台 再回到应用, 需要曝光
- …
甚至不同的产品不同的业务这里曝光规则都会不一样, 如果每个业务自己去单独实现, 又会有很多重复代码.
我封装了一个简单曝光的分类
使用方法可以参考: Example/SubItems/ScrollView/WYScrollExposureViewController.m
简单来说
- 导入文件, 并
import
头文件 - 实现 UIScrollViewDelegate, 滚动的时候调用
simple_markScrollViewDidScroll
方法, 每调用一次, 都会检查屏幕上是否存在没有曝光的列表元素, 然后曝光1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23// 看需要可以打开, 或者做下限频, 比如一秒调用一次
//- (void)scrollViewDidScroll:(UIScrollView *)scrollView
//{
// [self stoppedScrollingForExposure];
//}
- (void)scrollViewDidEndDecelerating:(UIScrollView *)scrollView
{
[self stoppedScrollingForExposure];
}
- (void)scrollViewDidEndDragging:(UIScrollView *)scrollView willDecelerate:(BOOL)decelerate
{
if (!decelerate)
{
[self stoppedScrollingForExposure];
}
}
- (void)stoppedScrollingForExposure
{
[self.tableView simple_markScrollViewDidScroll];
} - 在各个业务时机调用
simple_exposureWhenNeed
以及simple_markInvisibleForExposure
- 页面出现时候, 如页面刷新时, 页面出现时, 从二级页返回时, 后台回到前台, 调用
simple_exposureWhenNeed
- 页面消失时, 如退出页面, 进到二级页, 退到后台, 页面刷新之前 调用
simple_markInvisibleForExposure
1
2
3
4
5
6
7
8
9
10
11
- (void)exposureWhenNeed
{
[self.tableView simple_exposureWhenNeed];
}
- (void)markInvisibleForExposure
{
[self.tableView simple_markInvisibleForExposure];
}
- 页面出现时候, 如页面刷新时, 页面出现时, 从二级页返回时, 后台回到前台, 调用
- cell 需要实现
WYScrollViewItemSimpleExposureProtocol
委托- 需要曝光则返回一个不重复字符串, 不需要曝光则返回空字符串即可
- 收到
simple_exposureStatInfo
回调时, 自行做上报即可1
2
3
4
5
6
7
8
9
10#pragma mark - WYScrollViewItemSimpleExposureProtocol
- (NSString *)simple_exposureIdentifier
{
return WY_AVOID_NIL_STRING(self.data);
}
- (void)simple_exposureStatInfo:(NSString *)identifier;
{
NSLog(@"Exposure %@", identifier);
}