如何在iOS应用程序上同步UITableView滚动和CoraData fetch?

时间:2014-04-14 07:40:22

标签: ios objective-c uitableview core-data

我想实现以下功能,你能不能帮助我。

我的应用中有核心数据库。在该数据库中,一个模型CourseEvents包含超过150000个记录,每个记录包含大约12个字段。

每个UITableViewCell的记录值。

但我不想在一次获取请求中获取所有记录。想要根据N滚动来获取一些UITableView个记录。

示例:

当表视图加载第一次想要获取200条记录时,每当用户滚动UITableView需要获取下一条200条记录时,就像需要根据UITableview的滚动从模型中获取数据一样

我怎样才能做到这一点。请帮助.....

2 个答案:

答案 0 :(得分:3)

如果我正确理解你的问题,当你最初加载视图时,你只想获取200条记录,而在tableView Scroll上你想要获取下一条200,依此类推。您正在使用核心数据,然后在NSFetchedResultsController的帮助下更轻松地获取记录。只需将setFetchBatchSize设置为您要获取的任何记录(在您的情况下,20也应该是好的)。网上有很多例子,还有很棒的苹果样本。以下是CoreDataBooks示例的链接。关于如何使用NSFetchedResultsController,这是很好的tutorial。最后Core Data Programming guide是你的帮助。这是关于如何使用NSFetchedResultController的示例代码

- (void)viewDidLoad {
    [super viewDidLoad];

    NSError *error;
    if (![[self fetchedResultsController] performFetch:&error]) {
        // Update to handle the error appropriately.
        NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
        exit(-1);  // Fail
    }


}

- (NSFetchedResultsController *)fetchedResultsController {

    if (_fetchedResultsController != nil) {
        return _fetchedResultsController;
    }

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription
        entityForName:@"FailedBankInfo" inManagedObjectContext:managedObjectContext];
    [fetchRequest setEntity:entity];

    NSSortDescriptor *sort = [[NSSortDescriptor alloc]
        initWithKey:@"details.closeDate" ascending:NO];
    [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];

    [fetchRequest setFetchBatchSize:20];

    NSFetchedResultsController *theFetchedResultsController =
        [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
            managedObjectContext:managedObjectContext sectionNameKeyPath:nil
            cacheName:@"Root"];
    self.fetchedResultsController = theFetchedResultsController;
    _fetchedResultsController.delegate = self;

    return _fetchedResultsController;

}

- (NSInteger)tableView:(UITableView *)tableView
    numberOfRowsInSection:(NSInteger)section {
    id  sectionInfo =
        [[_fetchedResultsController sections] objectAtIndex:section];
    return [sectionInfo numberOfObjects];
}

- (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath {
    EntityName *entity = [_fetchedResultsController objectAtIndexPath:indexPath];
    cell.textLabel.text = entity.name; //just example
    cell.detailTextLabel.text = [NSString stringWithFormat:@"%@, %@",
        entity.city, entity.state];
}

- (UITableViewCell *)tableView:(UITableView *)tableView
    cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";

    UITableViewCell *cell =
        [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    // Set up the cell...
    [self configureCell:cell atIndexPath:indexPath];

    return cell;
}

答案 1 :(得分:1)

这个示例项目帮助我实现了我的解决方案。它也可能对你有帮助。 https://github.com/lukagabric/LargeDatasetSample