Skip to content

Commit 5bb90d1

Browse files
committed
整理
1 parent 8b0dfcb commit 5bb90d1

1 file changed

Lines changed: 80 additions & 74 deletions

File tree

ZHIntersectionObserver/Source/IntersectionObserverMeasure.m

Lines changed: 80 additions & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -16,19 +16,19 @@
1616

1717
@interface IntersectionObserverContainerOptions (Utils)
1818

19-
@property(nonatomic, assign) BOOL previousVisible;
19+
@property(nonatomic, assign) BOOL preVisible;
2020

2121
@end
2222

2323

2424
@interface IntersectionObserverTargetOptions (Utils)
2525

26-
@property(nonatomic, assign) CGFloat previousRatio;
27-
@property(nonatomic, assign) BOOL previousInsecting;
28-
@property(nonatomic, assign) BOOL previousVisible;
29-
@property(nonatomic, copy) NSString *previousDataKey;
30-
@property(nonatomic, copy) NSDictionary *previousData;
31-
@property(nonatomic, assign) BOOL previousFixedInsecting;
26+
@property(nonatomic, assign) CGFloat preRatio;
27+
@property(nonatomic, assign) BOOL preInsecting;
28+
@property(nonatomic, assign) BOOL preVisible;
29+
@property(nonatomic, copy) NSString *preDataKey;
30+
@property(nonatomic, copy) NSDictionary *preData;
31+
@property(nonatomic, assign) BOOL preReuseInsecting;
3232

3333
@end
3434

@@ -77,22 +77,27 @@ + (void)measureWithObserver:(IntersectionObserver *)observer forTargetView:(UIVi
7777
CGFloat ratio = [[calcResult objectForKey:@"ratio"] doubleValue];
7878
CGRect viewportTargetRect = [[calcResult objectForKey:@"viewportTargetRect"] CGRectValue];
7979
CGRect intersectionRect = [[calcResult objectForKey:@"intersectionRect"] CGRectValue];
80-
if (ratio < 0) continue;
8180

82-
// previousFixedInsecting 是为了一个 view 被复用很多次都没有曝光的情况下,会一直发送 isInsecting = NO 的事件,例如 delayReport 并且快速滚动的时候
83-
if (options.dataKey && options.dataKey.length > 0 && ![options.dataKey isEqualToString:options.previousDataKey] &&
84-
options.previousInsecting && options.previousFixedInsecting) {
81+
if (ratio < 0) {
82+
continue;
83+
}
84+
85+
// preReuseInsecting 是为了结局一个 view 被复用很多次都没有曝光的情况下,会一直发送 isInsecting = NO 的事件,例如 delayReport 并且快速滚动的时候
86+
if (options.dataKey && options.dataKey.length > 0 &&
87+
![options.dataKey isEqualToString:options.preDataKey] &&
88+
options.preInsecting &&
89+
options.preReuseInsecting) {
8590
IntersectionObserverEntry *entry =
8691
[IntersectionObserverEntry initEntryWithTargetView:curTargetView
87-
dataKey:options.previousDataKey
88-
data:options.previousData
92+
dataKey:options.preDataKey
93+
data:options.preData
8994
boundingClientRect:viewportTargetRect
9095
intersectionRatio:ratio
9196
intersectionRect:intersectionRect
9297
isInsecting:NO
9398
rootBounds:containerView.bounds
9499
time:floor([NSDate date].timeIntervalSince1970 * 1000)];
95-
options.previousFixedInsecting = NO;
100+
options.preReuseInsecting = NO;
96101
[reusedEntries addObject:entry];
97102
[[IntersectionObserverReuseManager shareInstance] addReusedDataKey:entry.dataKey toScope:scope];
98103
}
@@ -125,25 +130,27 @@ + (void)measureWithObserver:(IntersectionObserver *)observer forTargetView:(UIVi
125130
[hideEntries addObject:entry];
126131
}
127132
if (!delayReportEntry) {
128-
options.previousInsecting = isInsecting;
129-
options.previousFixedInsecting = isInsecting;
130-
options.previousDataKey = options.dataKey;
131-
options.previousData = options.data;
133+
// 更新各种 pre 值
134+
options.preInsecting = isInsecting;
135+
options.preReuseInsecting = isInsecting;
136+
options.preDataKey = options.dataKey;
137+
options.preData = options.data;
132138
if (containerOptions.measureWhenVisibilityChanged) {
133-
options.previousVisible = [self isTargetViewVisible:curTargetView inContainerView:containerView];
139+
options.preVisible = [self isTargetViewVisible:curTargetView inContainerView:containerView];
134140
}
135141
}
136142
}
137143

138-
// 非 canReport 也要更新
144+
// 非 canReport 也要更新 preRatio
139145
if (!delayReportEntry) {
140-
options.previousRatio = ratio;
146+
options.preRatio = ratio;
141147
}
142148
}
143149

150+
// 更新 pre 值
144151
if (!delayReport) {
145152
if (containerOptions.measureWhenVisibilityChanged) {
146-
containerOptions.previousVisible = [self isContainerViewVisible:containerView];
153+
containerOptions.preVisible = [self isContainerViewVisible:containerView];
147154
}
148155
}
149156

@@ -249,20 +256,19 @@ + (void)delayMeasureWithObserver:(IntersectionObserver *)observer
249256
time:floor([NSDate date].timeIntervalSince1970 * 1000)];
250257
[filterEntries addObject:entry];
251258

252-
options.previousInsecting = isInsecting;
253-
options.previousFixedInsecting = isInsecting;
254-
options.previousDataKey = options.dataKey;
255-
options.previousData = options.data;
259+
options.preRatio = ratio;
260+
options.preInsecting = isInsecting;
261+
options.preReuseInsecting = isInsecting;
262+
options.preDataKey = options.dataKey;
263+
options.preData = options.data;
256264

257265
if (containerOptions.measureWhenVisibilityChanged) {
258-
options.previousVisible = [self isTargetViewVisible:targetView inContainerView:containerView];
266+
options.preVisible = [self isTargetViewVisible:targetView inContainerView:containerView];
259267
}
260-
261-
options.previousRatio = ratio;
262268
}
263269

264270
if (containerOptions.measureWhenVisibilityChanged) {
265-
containerOptions.previousVisible = [self isContainerViewVisible:containerView];
271+
containerOptions.preVisible = [self isContainerViewVisible:containerView];
266272
}
267273

268274
if (filterEntries.count > 0) {
@@ -323,14 +329,14 @@ + (BOOL)canReportWithRatio:(CGFloat)ratio
323329
if (prevApplicationState != UIApplicationStateActive &&
324330
UIApplication.sharedApplication.applicationState == UIApplicationStateActive) {
325331
// TODO: 先直接返回 YES,这样导致那些那些一开始没曝光的 item 会发送多 isInsecting = NO 的通知
326-
// TODO: 如果改为 isInsecting != targetOptions.previousInsecting 会导致 cell 不复用的情况切换前后台无法触发事件
327-
return YES; // isInsecting != targetOptions.previousInsecting;
332+
// TODO: 如果改为 isInsecting != targetOptions.preInsecting 会导致 cell 不复用的情况切换前后台无法触发事件
333+
return YES; // isInsecting != targetOptions.preInsecting;
328334
}
329335
if (prevApplicationState != UIApplicationStateBackground &&
330336
UIApplication.sharedApplication.applicationState == UIApplicationStateBackground) {
331337
// TODO: 先直接返回 YES,这样导致那些那些一开始没曝光的 item 会发送多 isInsecting = NO 的通知
332-
// TODO: 如果改为 isInsecting != targetOptions.previousInsecting 会导致 cell 不复用的情况切换前后台无法触发事件
333-
return YES; // isInsecting != targetOptions.previousInsecting;
338+
// TODO: 如果改为 isInsecting != targetOptions.preInsecting 会导致 cell 不复用的情况切换前后台无法触发事件
339+
return YES; // isInsecting != targetOptions.preInsecting;
334340
}
335341
}
336342

@@ -339,13 +345,13 @@ + (BOOL)canReportWithRatio:(CGFloat)ratio
339345
if (containerOptions.measureWhenVisibilityChanged) {
340346
BOOL targetViewVisible = [self isTargetViewVisible:targetOptions.targetView inContainerView:containerOptions.containerView];
341347
BOOL containerViewVisible = [self isContainerViewVisible:containerOptions.containerView];
342-
if (targetViewVisible != targetOptions.previousVisible || containerViewVisible != containerOptions.previousVisible) {
343-
return isInsecting != targetOptions.previousInsecting;
348+
if (targetViewVisible != targetOptions.preVisible || containerViewVisible != containerOptions.preVisible) {
349+
return isInsecting != targetOptions.preInsecting;
344350
}
345351
}*/
346352

347353
// 数据发生变化(或者复用)
348-
if (targetOptions.dataKey && targetOptions.dataKey.length > 0 && ![targetOptions.dataKey isEqualToString:targetOptions.previousDataKey]) {
354+
if (targetOptions.dataKey && targetOptions.dataKey.length > 0 && ![targetOptions.dataKey isEqualToString:targetOptions.preDataKey]) {
349355
if (isInsecting) {
350356
return !isDataKeyVisible;
351357
} else {
@@ -355,12 +361,12 @@ + (BOOL)canReportWithRatio:(CGFloat)ratio
355361

356362
// 前后 ratio 变化
357363
if ([self isInsectingWithRatio:ratio containerOptions:containerOptions targetOptions:targetOptions] !=
358-
[self isInsectingWithRatio:targetOptions.previousRatio containerOptions:containerOptions targetOptions:targetOptions]) {
364+
[self isInsectingWithRatio:targetOptions.preRatio containerOptions:containerOptions targetOptions:targetOptions]) {
359365
return YES;
360366
}
361367

362368
// 是否达到某个 ratio
363-
return [self lastMatchThreshold:containerOptions.thresholds ratio:ratio] != [self lastMatchThreshold:containerOptions.thresholds ratio:targetOptions.previousRatio];
369+
return [self lastMatchThreshold:containerOptions.thresholds ratio:ratio] != [self lastMatchThreshold:containerOptions.thresholds ratio:targetOptions.preRatio];
364370
}
365371

366372
+ (BOOL)isContainerViewVisible:(UIView *)containerView {
@@ -457,76 +463,76 @@ + (BOOL)isCGRectValidated:(CGRect)rect {
457463
@end
458464

459465

460-
static char kAssociatedObjectKey_UtilsContainerPreviousVisible;
466+
static char kAssociatedObjectKey_UtilsContainerPreVisible;
461467

462468
@implementation IntersectionObserverContainerOptions (Utils)
463469

464-
- (void)setPreviousVisible:(BOOL)previousVisible {
465-
objc_setAssociatedObject(self, &kAssociatedObjectKey_UtilsContainerPreviousVisible, @(previousVisible), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
470+
- (void)setPreVisible:(BOOL)preVisible {
471+
objc_setAssociatedObject(self, &kAssociatedObjectKey_UtilsContainerPreVisible, @(preVisible), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
466472
}
467473

468-
- (BOOL)previousVisible {
469-
return [objc_getAssociatedObject(self, &kAssociatedObjectKey_UtilsContainerPreviousVisible) boolValue];
474+
- (BOOL)preVisible {
475+
return [objc_getAssociatedObject(self, &kAssociatedObjectKey_UtilsContainerPreVisible) boolValue];
470476
}
471477

472478
@end
473479

474480

475-
static char kAssociatedObjectKey_UtilsPreviousRatio;
476-
static char kAssociatedObjectKey_UtilsPreviousInsecting;
477-
static char kAssociatedObjectKey_UtilsPreviousFixedInsecting;
478-
static char kAssociatedObjectKey_UtilsPreviousVisible;
479-
static char kAssociatedObjectKey_UtilsPreviousDataKey;
480-
static char kAssociatedObjectKey_UtilsPreviousData;
481+
static char kAssociatedObjectKey_UtilsPreRatio;
482+
static char kAssociatedObjectKey_UtilsPreInsecting;
483+
static char kAssociatedObjectKey_UtilsPreReuseInsecting;
484+
static char kAssociatedObjectKey_UtilsPreVisible;
485+
static char kAssociatedObjectKey_UtilsPreDataKey;
486+
static char kAssociatedObjectKey_UtilsPreData;
481487

482488
@implementation IntersectionObserverTargetOptions (Utils)
483489

484-
- (void)setPreviousRatio:(CGFloat)previousRatio {
485-
objc_setAssociatedObject(self, &kAssociatedObjectKey_UtilsPreviousRatio, @(previousRatio), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
490+
- (void)setPreRatio:(CGFloat)preRatio {
491+
objc_setAssociatedObject(self, &kAssociatedObjectKey_UtilsPreRatio, @(preRatio), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
486492
}
487493

488-
- (CGFloat)previousRatio {
489-
return [objc_getAssociatedObject(self, &kAssociatedObjectKey_UtilsPreviousRatio) doubleValue];
494+
- (CGFloat)preRatio {
495+
return [objc_getAssociatedObject(self, &kAssociatedObjectKey_UtilsPreRatio) doubleValue];
490496
}
491497

492-
- (void)setPreviousInsecting:(BOOL)previousInsecting {
493-
objc_setAssociatedObject(self, &kAssociatedObjectKey_UtilsPreviousInsecting, @(previousInsecting), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
498+
- (void)setPreInsecting:(BOOL)preInsecting {
499+
objc_setAssociatedObject(self, &kAssociatedObjectKey_UtilsPreInsecting, @(preInsecting), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
494500
}
495501

496-
- (BOOL)previousInsecting {
497-
return [objc_getAssociatedObject(self, &kAssociatedObjectKey_UtilsPreviousInsecting) boolValue];
502+
- (BOOL)preInsecting {
503+
return [objc_getAssociatedObject(self, &kAssociatedObjectKey_UtilsPreInsecting) boolValue];
498504
}
499505

500-
- (void)setPreviousFixedInsecting:(BOOL)previousFixedInsecting {
501-
objc_setAssociatedObject(self, &kAssociatedObjectKey_UtilsPreviousFixedInsecting, @(previousFixedInsecting), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
506+
- (void)setPreReuseInsecting:(BOOL)preReuseInsecting {
507+
objc_setAssociatedObject(self, &kAssociatedObjectKey_UtilsPreReuseInsecting, @(preReuseInsecting), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
502508
}
503509

504-
- (BOOL)previousFixedInsecting {
505-
return [objc_getAssociatedObject(self, &kAssociatedObjectKey_UtilsPreviousFixedInsecting) boolValue];
510+
- (BOOL)preReuseInsecting {
511+
return [objc_getAssociatedObject(self, &kAssociatedObjectKey_UtilsPreReuseInsecting) boolValue];
506512
}
507513

508-
- (void)setPreviousVisible:(BOOL)previousVisible {
509-
objc_setAssociatedObject(self, &kAssociatedObjectKey_UtilsPreviousVisible, @(previousVisible), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
514+
- (void)setPreVisible:(BOOL)preVisible {
515+
objc_setAssociatedObject(self, &kAssociatedObjectKey_UtilsPreVisible, @(preVisible), OBJC_ASSOCIATION_RETAIN_NONATOMIC);
510516
}
511517

512-
- (BOOL)previousVisible {
513-
return [objc_getAssociatedObject(self, &kAssociatedObjectKey_UtilsPreviousVisible) boolValue];
518+
- (BOOL)preVisible {
519+
return [objc_getAssociatedObject(self, &kAssociatedObjectKey_UtilsPreVisible) boolValue];
514520
}
515521

516-
- (void)setPreviousDataKey:(NSString *)previousDataKey {
517-
objc_setAssociatedObject(self, &kAssociatedObjectKey_UtilsPreviousDataKey, previousDataKey, OBJC_ASSOCIATION_COPY_NONATOMIC);
522+
- (void)setPreDataKey:(NSString *)preDataKey {
523+
objc_setAssociatedObject(self, &kAssociatedObjectKey_UtilsPreDataKey, preDataKey, OBJC_ASSOCIATION_COPY_NONATOMIC);
518524
}
519525

520-
- (NSString *)previousDataKey {
521-
return objc_getAssociatedObject(self, &kAssociatedObjectKey_UtilsPreviousDataKey);
526+
- (NSString *)preDataKey {
527+
return objc_getAssociatedObject(self, &kAssociatedObjectKey_UtilsPreDataKey);
522528
}
523529

524-
- (void)setPreviousData:(NSDictionary *)previousData {
525-
objc_setAssociatedObject(self, &kAssociatedObjectKey_UtilsPreviousData, previousData, OBJC_ASSOCIATION_COPY_NONATOMIC);
530+
- (void)setPreData:(NSDictionary *)preData {
531+
objc_setAssociatedObject(self, &kAssociatedObjectKey_UtilsPreData, preData, OBJC_ASSOCIATION_COPY_NONATOMIC);
526532
}
527533

528-
- (NSDictionary *)previousData {
529-
return objc_getAssociatedObject(self, &kAssociatedObjectKey_UtilsPreviousData);
534+
- (NSDictionary *)preData {
535+
return objc_getAssociatedObject(self, &kAssociatedObjectKey_UtilsPreData);
530536
}
531537

532538
@end

0 commit comments

Comments
 (0)