I
I
iosparamamaxxx2014-10-08 10:54:30
Objective-C
iosparamamaxxx, 2014-10-08 10:54:30

How to correctly load new Core Data IOS data?

I am making an application on IOS that communicates with the server (via RestKit) and stores data in Core Data.
I would like to organize preloading: in the tableview, we first display the first 20 records, as soon as we approach the end of the table (40 pixels or 4 cells before the end), we load more data.
Example: Facebook application, IOS
How to do it correctly for two options:
- if I initially loaded 10,000 records into Core Data and want to display only 30 records at first and then 30 more on request. I used this code, but the application loaded new data with freezes

@interface InfiniteScrollViewController ()

@property (nonatomic) NSMutableArray *tableViewData;
@property (nonatomic) BOOL loadingMoreTableViewData;

@end

@implementation InfiniteScrollViewController

- (void)viewDidLoad {
    self.tableViewData = [[NSMutableArray alloc] init];
    [self addSomeMoreEntriesToTableView];
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return self.tableViewData.count + 1;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    if (indexPath.row < self.tableViewData.count) {
        cell.textLabel.text = [self.tableViewData objectAtIndex:indexPath.row];
    } else {
        cell.textLabel.text = @"Loading more data...";

        // User has scrolled to the bottom of the list of available data so simulate loading some more if we aren't already
        if (!self.loadingMoreTableViewData) {
            self.loadingMoreTableViewData = YES;
            [self performSelector:@selector(addSomeMoreEntriesToTableView) withObject:nil afterDelay:5.0f];
        }
    }

    return cell;
}

- (void)addSomeMoreEntriesToTableView {
    int loopTill = self.tableViewData.count + 20;
    while (self.tableViewData.count < loopTill) {
        [self.tableViewData addObject:[NSString stringWithFormat:@"%i", self.tableViewData.count]];
    };
    self.loadingMoreTableViewData = NO;
    [self.tableView reloadData];
}

@end

- download from the server every time

Answer the question

In order to leave comments, you need to log in

[[+comments_count]] answer(s)
S
siben7, 2014-11-01
@siben7

See what NSFetchedResultsController is.

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question