NSTableView:我可以懒惰地获取表数据源的子集吗?

时间:2016-07-04 07:37:11

标签: objective-c macos cocoa

我可以懒惰地获取NSTableView数据源的子集吗? 所以我不需要将整个数据库加载到内存中?因此,当表格滚动时,应用程序将再次访问核心数据。

目前我还没弄明白如何为整个数据源启用/禁用延迟抓取。但我想知道是否有办法在不同的运行中拆分提取"。

2 个答案:

答案 0 :(得分:1)

在这种情况下,我最喜欢的方法是遵循。

我在控制器中保存了一系列已加载的记录。在viewDidLoad中,此数组包含零个元素。然后我从数据库请求记录的第一部分(例如,限制为50个记录的提取限制)。获取记录后,我将它们放入此数组中。还有一个标志,表示是否加载了所有记录。

在我的表视图中,我总是显示数组中的所有记录。如果没有加载所有记录,那么我添加一个带活动指示符的单元格当用户将表视图向下滚动到具有活动指示符的单元格时,我请求从数据库加载下一部分记录(再次使用偏移和提取限制)。加载记录后,我将它们添加到我的数组,更新标志并在我的tableView上调用reloadData。

我的tableViewDataSource的两个主要方法如下:

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

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    if (indexPath.row>=self.dataArray.count) {
        // indicator cell
        [self requestReadNext];
        UITableViewCell* cell=[tableView dequeueReusableCellWithIdentifier:@"IndicatorCell" forIndexPath:indexPath];
        return cell;
    } else {
        MyCell* cell=[tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
        MyObject* obj=[self.dataArray objectAtIndex:indexPath.row];
        [self fillCell:cell withObject:obj];
        return cell;
    }
}

答案 1 :(得分:0)

使用核心数据提取,您可以指定Offset。与fetch limit结合的偏移量为您提供范围。当您的tableview滚动到最后一个对象时,请执行另一次提取并将当前计数指定为偏移量和您的首选限制。