前阶段做版本需求,在后期大概花了一半的时间在业务统计上,特别是曝光统计,是带有业务性质的统计,所以无痕埋点暂时没辙,每次都需要花费大量精力,所以决定整理下 UIView
的 曝光监听
当然它的用途并不是仅在曝光统计上,一些想要延迟到曝光时才做的事情均可以滴,譬如 UIScrollView
上的 UIImageView
的图片加载操作就可以等到曝光的时候才去加载,酱紫若是 UIScrollView
有多个 UIImageView
的子视图,也不会内存暴涨呢
总结下来其实就是:将一些操作 延迟到曝光
后才做
基本要求
a. 简单设置UIView
的曝光操作exposureBlock
,即可在UIView
曝光时执行
b. 在主线程休闲时进行UIView
的曝光计算
c.UIView
曝光过后,重新设置exposureBlock
,再次进入曝光计算并曝光时执行实现
监听 UIView 曝光封装
a. 目前的实现思路主要是监听mainRunLoop
,在收到kCFRunLoopBeforeWaiting
即将进入休眠的通知时进行曝光计算,以防阻塞正常的主线程操作
b.UIView
的曝光计算,主要⚠️隐藏
或者透明度太低
或者window == nil
,其它均为常规计算与屏幕的rect
是否有碰撞即可
c. 添加UIView
的曝光必须是线程安全的,目前均在主线程添加使用
UIView *view = [[UIView alloc] initWithFrame:CGRectMake(10, 10, 30, 30)];
view.ly_exposureBlock = ^(UIView *view) {
//曝光了,做点啥
// UIScrollview上的UIImageView可以在曝光时才去加载图片等
};
[self.view addSubview:view];
....
view.ly_exposureBlock = ^(UIView *view) {
//曝光后重新设置曝光操作,会再次曝光,那又做点啥
};
UIImageView *imgView = [[UIImageView alloc] init];
imgView.ly_exposureBlock = ^(UIImageView *imgView) {
//曝光后才去加载图片
[imgView sd_setImageWithURL:imgUrl];
};
UIView *view1 = [[UIView alloc] initWithFrame:CGRectMake(-40, -50, 30, 30)];
view1.ly_exposureBlock = ^(UIView *view) {
// view1 曝光了,做点啥
};
[self.view addSubview:view1];
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(3.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
//增加曝光补偿后,view1 才会曝光
view2.ly_ECompensationSize = CGSizeMake(15, 25);
});
- 完善期望
a.UITableView
UICollectionView
的相关曝光
b.PageViewContrller
预加载页面的曝光处理
c. 整个页面的延迟曝光,某个UIView
的延迟曝光
d.曝光补偿 - 已加