Skip to content

Commit

Permalink
Follow up on the ASRangeController fix in #1418 (#1419)
Browse files Browse the repository at this point in the history
The changes in #1418 is a bit too aggressive when it comes to nodes that are in display range. It forces those nodes to not preload.

Also update the changes to avoid diluting the experiment data by triggering too broadly (i.e avoid triggering when the old and new implementations yield the same result leading to no behavior change).
  • Loading branch information
nguyenhuy authored Mar 22, 2019
1 parent 5937ac3 commit dbe1ceb
Showing 1 changed file with 20 additions and 11 deletions.
31 changes: 20 additions & 11 deletions Source/Details/ASRangeController.mm
Original file line number Diff line number Diff line change
Expand Up @@ -351,25 +351,34 @@ - (void)_updateVisibleNodeIndexPaths
} else {
// If selfInterfaceState isn't visible, then visibleIndexPaths represents either what /will/ be immediately visible at the
// instant we come onscreen, or what /will/ no longer be visible at the instant we come offscreen.
// So, preload and display all of those things, but don't waste resources preloading others.
// We handle this as a separate case to minimize set operations, including -containsObject:.
// So, preload and display all of those things, but don't waste resources displaying others.
//
// DO NOT set Visible: even though these elements are in the visible range / "viewport",
// our overall container object is itself not yet, or no longer, visible.
// The moment it becomes visible, we will run the condition above.

BOOL shouldUpdateInterfaceState = NO;
if (ASActivateExperimentalFeature(ASExperimentalFixRangeController)) {
shouldUpdateInterfaceState = [visibleIndexPaths containsObject:indexPath];
} else {
shouldUpdateInterfaceState = [allCurrentIndexPaths containsObject:indexPath];
ASInterfaceState interfaceStateBeforeFix = interfaceState;
if ([allCurrentIndexPaths containsObject:indexPath]) {
interfaceStateBeforeFix |= ASInterfaceStatePreload;
if (rangeMode != ASLayoutRangeModeLowMemory) {
interfaceStateBeforeFix |= ASInterfaceStateDisplay;
}
}

if (shouldUpdateInterfaceState) {
interfaceState |= ASInterfaceStatePreload;

ASInterfaceState interfaceStateAfterFix = interfaceState;
if ([visibleIndexPaths containsObject:indexPath]) {
interfaceStateAfterFix |= ASInterfaceStatePreload;
if (rangeMode != ASLayoutRangeModeLowMemory) {
interfaceState |= ASInterfaceStateDisplay;
interfaceStateAfterFix |= ASInterfaceStateDisplay;
}
} else if ([displayIndexPaths containsObject:indexPath]) {
interfaceStateAfterFix |= ASInterfaceStatePreload;
}

if (interfaceStateBeforeFix != interfaceStateAfterFix && ASActivateExperimentalFeature(ASExperimentalFixRangeController)) {
interfaceState = interfaceStateAfterFix;
} else {
interfaceState = interfaceStateBeforeFix;
}
}

Expand Down

0 comments on commit dbe1ceb

Please sign in to comment.