@@ -125,7 +125,7 @@ + (void)measureWithObserver:(IntersectionObserver *)observer forTargetView:(UIVi
125125 } else {
126126 [hideEntries addObject: entry];
127127 }
128- if (!isInsecting || !delayReport ) {
128+ if (!delayReportEntry ) {
129129 options.previousInsecting = isInsecting;
130130 options.previousFixedInsecting = isInsecting;
131131 options.previousDataKey = options.dataKey ;
@@ -156,28 +156,27 @@ + (void)measureWithObserver:(IntersectionObserver *)observer forTargetView:(UIVi
156156 }
157157
158158 if (reusedEntries.count > 0 ) {
159+ // 0.2s 之后检查被复用的 view 的 dataKey 是否还是曝光状态
159160 dispatch_after (dispatch_time (DISPATCH_TIME_NOW, (int64_t )(0.2 * NSEC_PER_SEC)), dispatch_get_main_queue (), ^{
160- if (reusedEntries.count > 0 ) {
161- NSMutableArray *filterReusedEntries = [[NSMutableArray alloc ] init ];
162- [reusedEntries enumerateObjectsUsingBlock: ^(IntersectionObserverEntry * _Nonnull entry, NSUInteger idx, BOOL * _Nonnull stop) {
163- BOOL removed = [[IntersectionObserverReuseManager shareInstance ] isReusedDataKeyRemoved: entry.dataKey inScope: scope];
164- if (!removed) {
165- [filterReusedEntries addObject: entry];
166- [[IntersectionObserverReuseManager shareInstance ] removeReuseDataKey: entry.dataKey fromScope: scope];
167- }
168- }];
169- [[IntersectionObserverReuseManager shareInstance ] removeVisibleEntries: filterReusedEntries.copy fromScope: scope];
170- if (containerOptions.callback && filterReusedEntries.count > 0 ) {
171- containerOptions.callback (scope, filterReusedEntries);
161+ NSMutableArray *filterReusedEntries = [[NSMutableArray alloc ] init ];
162+ [reusedEntries enumerateObjectsUsingBlock: ^(IntersectionObserverEntry * _Nonnull entry, NSUInteger idx, BOOL * _Nonnull stop) {
163+ BOOL removed = [[IntersectionObserverReuseManager shareInstance ] isReusedDataKeyRemoved: entry.dataKey inScope: scope];
164+ if (!removed) {
165+ [filterReusedEntries addObject: entry];
166+ [[IntersectionObserverReuseManager shareInstance ] removeReuseDataKey: entry.dataKey fromScope: scope];
172167 }
168+ }];
169+ [[IntersectionObserverReuseManager shareInstance ] removeVisibleEntries: filterReusedEntries.copy fromScope: scope];
170+ if (containerOptions.callback && filterReusedEntries.count > 0 ) {
171+ containerOptions.callback (scope, filterReusedEntries);
173172 }
174173 });
175174 }
176175
177176 if (entries.count > 0 ) {
178177 if (delayReport) {
179178 dispatch_after (dispatch_time (DISPATCH_TIME_NOW, (int64_t )(containerOptions.intersectionDuration / 1000.0 * NSEC_PER_SEC)), dispatch_get_main_queue (), ^{
180- [self delayMeasureWithObserver: observer entries: entries.copy reusedEntries: reusedEntries.copy ];
179+ [self delayMeasureWithObserver: observer entries: entries.copy];
181180 });
182181 } else {
183182 [[IntersectionObserverReuseManager shareInstance ] addVisibleEntries: entries.copy toScope: scope];
@@ -193,8 +192,7 @@ + (void)measureWithObserver:(IntersectionObserver *)observer forTargetView:(UIVi
193192}
194193
195194+ (void )delayMeasureWithObserver : (IntersectionObserver *)observer
196- entries : (NSArray <IntersectionObserverEntry *> *)entries
197- reusedEntries : (NSArray <IntersectionObserverEntry *> *)reusedEntries {
195+ entries : (NSArray <IntersectionObserverEntry *> *)entries {
198196
199197 // 简单判断下当前 options 和 entries
200198 IntersectionObserverContainerOptions *containerOptions = observer.containerOptions ;
@@ -233,7 +231,8 @@ + (void)delayMeasureWithObserver:(IntersectionObserver *)observer
233231 }
234232
235233 BOOL isInsecting = [self isInsectingWithRatio: ratio containerOptions: containerOptions targetOptions: options];
236- BOOL canReport = [oldEntry.dataKey isEqualToString: options.dataKey] && isInsecting == oldEntry.isInsecting && ![[IntersectionObserverReuseManager shareInstance ] isDataKeyVisible: options.dataKey inScope: scope];
234+ BOOL isDataKeyVisible = [[IntersectionObserverReuseManager shareInstance ] isDataKeyVisible: options.dataKey inScope: scope];
235+ BOOL canReport = [oldEntry.dataKey isEqualToString: options.dataKey] && isInsecting == oldEntry.isInsecting && !isDataKeyVisible;
237236
238237 if (!canReport) {
239238 continue ;
@@ -317,40 +316,41 @@ + (BOOL)canReportWithRatio:(CGFloat)ratio
317316
318317 BOOL isInsecting = [self isInsectingWithRatio: ratio containerOptions: containerOptions targetOptions: targetOptions];
319318
319+ BOOL isDataKeyVisible = targetOptions.dataKey ? [[IntersectionObserverReuseManager shareInstance ] isDataKeyVisible: targetOptions.dataKey inScope: containerOptions.scope] : NO ;
320+
320321 // 生命周期发生变化
321322 if (containerOptions.measureWhenAppStateChanged ) {
322323 UIApplicationState prevApplicationState = [IntersectionObserverManager shareInstance ].previousApplicationState ;
323- if (prevApplicationState != UIApplicationStateActive && UIApplication.sharedApplication .applicationState == UIApplicationStateActive) {
324- return ![[IntersectionObserverReuseManager shareInstance ] isDataKeyVisible: targetOptions.dataKey inScope: containerOptions.scope];
325- // return isInsecting != targetOptions.previousInsecting;
324+ if (prevApplicationState != UIApplicationStateActive &&
325+ UIApplication.sharedApplication .applicationState == UIApplicationStateActive) {
326+ // TODO: 先直接返回 YES,这样导致那些那些一开始没曝光的 item 会发送多 isInsecting = NO 的通知
327+ // TODO: 如果改为 isInsecting != targetOptions.previousInsecting 会导致 cell 不复用的情况切换前后台无法触发事件
328+ return YES ; // isInsecting != targetOptions.previousInsecting;
326329 }
327- if (prevApplicationState != UIApplicationStateBackground && UIApplication.sharedApplication .applicationState == UIApplicationStateBackground) {
328- return ![[IntersectionObserverReuseManager shareInstance ] isDataKeyVisible: targetOptions.dataKey inScope: containerOptions.scope];
329- // return isInsecting != targetOptions.previousInsecting;
330+ if (prevApplicationState != UIApplicationStateBackground &&
331+ UIApplication.sharedApplication .applicationState == UIApplicationStateBackground) {
332+ // TODO: 先直接返回 YES,这样导致那些那些一开始没曝光的 item 会发送多 isInsecting = NO 的通知
333+ // TODO: 如果改为 isInsecting != targetOptions.previousInsecting 会导致 cell 不复用的情况切换前后台无法触发事件
334+ return YES ; // isInsecting != targetOptions.previousInsecting;
330335 }
331336 }
332337
333- // 可视状态发生变化
338+ // TODO: 可视状态发生变化
334339 /*
335340 if (containerOptions.measureWhenVisibilityChanged) {
336341 BOOL targetViewVisible = [self isTargetViewVisible:targetOptions.targetView inContainerView:containerOptions.containerView];
337342 BOOL containerViewVisible = [self isContainerViewVisible:containerOptions.containerView];
338343 if (targetViewVisible != targetOptions.previousVisible || containerViewVisible != containerOptions.previousVisible) {
339344 return isInsecting != targetOptions.previousInsecting;
340345 }
341- }
342- */
346+ }*/
343347
344348 // 数据发生变化(或者复用)
345349 if (targetOptions.dataKey && targetOptions.dataKey .length > 0 && ![targetOptions.dataKey isEqualToString: targetOptions.previousDataKey]) {
346- BOOL inVisiblePool = [[IntersectionObserverReuseManager shareInstance ] isDataKeyVisible: targetOptions.dataKey inScope: containerOptions.scope];
347- if ([targetOptions.dataKey isEqualToString: @" 7" ]) {
348- NSLog (@" " );
349- }
350350 if (isInsecting) {
351- return !inVisiblePool ;
351+ return !isDataKeyVisible ;
352352 } else {
353- return inVisiblePool ;
353+ return isDataKeyVisible ;
354354 }
355355 }
356356
@@ -372,15 +372,15 @@ + (BOOL)isContainerViewVisible:(UIView *)containerView {
372372}
373373
374374+ (BOOL )isTargetViewVisible : (UIView *)targetView inContainerView : (UIView *)containerView {
375- // 这里先不要做 hidden 这个判断了,有些场景例如 cell 复用,cell 会临时被 hidden 掉,所以先去掉这个逻辑
375+ // TODO: 这里先不要做 hidden 这个判断了,有些场景例如 cell 复用,cell 会临时被 hidden 掉,所以先去掉这个逻辑
376376 // BOOL flag = targetView.hidden || targetView.alpha <= 0 || !targetView.window;
377- BOOL flag = targetView. alpha <= 0 || !targetView.window ;
377+ BOOL flag = !targetView.window ;
378378 if (flag) return NO ;
379379 BOOL visible = YES ;
380380 while (targetView.superview && targetView.superview != containerView) {
381381 targetView = targetView.superview ;
382382 // flag = targetView.hidden || targetView.alpha <= 0 || !targetView.window;
383- flag = targetView. alpha <= 0 || !targetView.window ;
383+ flag = !targetView.window ;
384384 if (flag) {
385385 visible = NO ;
386386 break ;
0 commit comments