Swiftgram/Source/Private/ASBatchFetching.m
appleguy 465abb1ded [License] Simplify the Texture license to be pure Apache 2 (removing ASDK-Licenses). (#1077)
* [License] Simplify the Texture license to be pure Apache 2 (removing ASDK-Licenses)

With permission of the Facebook Open Source team, we are simplifying the Texture
license so that clients can rely on the Apache 2 terms that most of Texture is
already covered by. This means that code originally forked from AsyncDisplayKit
will be re-licensed from "BSD 3-clause + PATENTS v2" to Apache 2 without a
PATENTS file.

After getting confirmation that the updates to these core files look good, we'll
propagate this new license header to all files (in this same PR) and get sign-off
from all parties before landing.

* [License] Update all Texture source files to be pure Apache 2.

* Changelog entry for Apache 2 license update.

* Revert "[License] Update all Texture source files to be pure Apache 2."

This reverts commit ffa0fbbba9717d871dd16c4b07539f2f8208fc2b.

* [License] Update all Texture source files to be pure Apache 2, maintaining copyrights.

* [License] Update CONTRIBUTING, README, Podspec & Dangerfile.
2018-08-28 07:39:18 -07:00

100 lines
3.8 KiB
Objective-C

//
// ASBatchFetching.m
// Texture
//
// Copyright (c) Facebook, Inc. and its affiliates. All rights reserved.
// Changes after 4/13/2017 are: Copyright (c) Pinterest, Inc. All rights reserved.
// Licensed under Apache 2.0: http://www.apache.org/licenses/LICENSE-2.0
//
#import <AsyncDisplayKit/ASBatchFetching.h>
#import <AsyncDisplayKit/ASBatchContext.h>
#import <AsyncDisplayKit/ASBatchFetchingDelegate.h>
BOOL ASDisplayShouldFetchBatchForScrollView(UIScrollView<ASBatchFetchingScrollView> *scrollView,
ASScrollDirection scrollDirection,
ASScrollDirection scrollableDirections,
CGPoint contentOffset,
CGPoint velocity)
{
// Don't fetch if the scroll view does not allow
if (![scrollView canBatchFetch]) {
return NO;
}
// Check if we should batch fetch
ASBatchContext *context = scrollView.batchContext;
CGRect bounds = scrollView.bounds;
CGSize contentSize = scrollView.contentSize;
CGFloat leadingScreens = scrollView.leadingScreensForBatching;
id<ASBatchFetchingDelegate> delegate = scrollView.batchFetchingDelegate;
BOOL visible = (scrollView.window != nil);
return ASDisplayShouldFetchBatchForContext(context, scrollDirection, scrollableDirections, bounds, contentSize, contentOffset, leadingScreens, visible, velocity, delegate);
}
BOOL ASDisplayShouldFetchBatchForContext(ASBatchContext *context,
ASScrollDirection scrollDirection,
ASScrollDirection scrollableDirections,
CGRect bounds,
CGSize contentSize,
CGPoint targetOffset,
CGFloat leadingScreens,
BOOL visible,
CGPoint velocity,
id<ASBatchFetchingDelegate> delegate)
{
// Do not allow fetching if a batch is already in-flight and hasn't been completed or cancelled
if ([context isFetching]) {
return NO;
}
// No fetching for null states
if (leadingScreens <= 0.0 || CGRectIsEmpty(bounds)) {
return NO;
}
CGFloat viewLength, offset, contentLength, velocityLength;
if (ASScrollDirectionContainsVerticalDirection(scrollableDirections)) {
viewLength = bounds.size.height;
offset = targetOffset.y;
contentLength = contentSize.height;
velocityLength = velocity.y;
} else { // horizontal / right
viewLength = bounds.size.width;
offset = targetOffset.x;
contentLength = contentSize.width;
velocityLength = velocity.x;
}
BOOL hasSmallContent = contentLength < viewLength;
if (hasSmallContent) {
return YES;
}
// If we are not visible, but we do have enough content to fill visible area,
// don't batch fetch.
if (visible == NO) {
return NO;
}
// If they are scrolling toward the head of content, don't batch fetch.
BOOL isScrollingTowardHead = (ASScrollDirectionContainsUp(scrollDirection) || ASScrollDirectionContainsLeft(scrollDirection));
if (isScrollingTowardHead) {
return NO;
}
CGFloat triggerDistance = viewLength * leadingScreens;
CGFloat remainingDistance = contentLength - viewLength - offset;
BOOL result = remainingDistance <= triggerDistance;
if (delegate != nil && velocityLength > 0.0) {
// Don't need to get absolute value of remaining time
// because both remainingDistance and velocityLength are positive when scrolling toward tail
NSTimeInterval remainingTime = remainingDistance / (velocityLength * 1000);
result = [delegate shouldFetchBatchWithRemainingTime:remainingTime hint:result];
}
return result;
}