// // PhotoFeedNodeController.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 "PhotoFeedNodeController.h" #import #import "Utilities.h" #import "PhotoModel.h" #import "PhotoCellNode.h" #import "PhotoFeedModel.h" #define AUTO_TAIL_LOADING_NUM_SCREENFULS 2.5 @interface PhotoFeedNodeController () @property (nonatomic, strong) ASTableNode *tableNode; @end @implementation PhotoFeedNodeController #pragma mark - Lifecycle // -init is often called off the main thread in ASDK. Therefore it is imperative that no UIKit objects are accessed. // Examples of common errors include accessing the node’s view or creating a gesture recognizer. - (instancetype)init { _tableNode = [[ASTableNode alloc] init]; self = [super initWithNode:_tableNode]; if (self) { self.navigationItem.title = @"ASDK"; [self.navigationController setNavigationBarHidden:YES]; _tableNode.dataSource = self; _tableNode.delegate = self; } return self; } // -loadView is guaranteed to be called on the main thread and is the appropriate place to // set up an UIKit objects you may be using. - (void)loadView { [super loadView]; self.tableNode.leadingScreensForBatching = AUTO_TAIL_LOADING_NUM_SCREENFULS; // overriding default of 2.0 } - (void)loadPageWithContext:(ASBatchContext *)context { [self.photoFeed requestPageWithCompletionBlock:^(NSArray *newPhotos){ [self insertNewRows:newPhotos]; if (context) { [context completeBatchFetching:YES]; } } numResultsToReturn:20]; } #pragma mark - Subclassing - (UITableView *)tableView { return _tableNode.view; } - (void)loadPage { [self loadPageWithContext:nil]; } #pragma mark - ASTableDataSource methods - (NSInteger)tableNode:(ASTableNode *)tableNode numberOfRowsInSection:(NSInteger)section { return [self.photoFeed numberOfItemsInFeed]; } - (ASCellNodeBlock)tableNode:(ASTableNode *)tableNode nodeBlockForRowAtIndexPath:(NSIndexPath *)indexPath { PhotoModel *photoModel = [self.photoFeed objectAtIndex:indexPath.row]; // this will be executed on a background thread - important to make sure it's thread safe ASCellNode *(^ASCellNodeBlock)() = ^ASCellNode *() { PhotoCellNode *cellNode = [[PhotoCellNode alloc] initWithPhotoObject:photoModel]; return cellNode; }; return ASCellNodeBlock; } #pragma mark - ASTableDelegate methods // Receive a message that the tableView is near the end of its data set and more data should be fetched if necessary. - (void)tableNode:(ASTableNode *)tableNode willBeginBatchFetchWithContext:(ASBatchContext *)context { [context beginBatchFetching]; [self loadPageWithContext:context]; } @end