objective c - NSTableView 重新加载数据

objective c - NSTableView Reload Data

我正在开发一个与 tableview 配合使用的应用程序。我需要将大量数据加载到我的 table 视图中(最多 500k 个元素)。当我加载数据时,我在另一个视图上显示动画。动画在主线程中运行。加载数据在后台线程上。我也在后台线程的 table 视图中执行重新加载数据。但我想让取消这个操作成为可能。

我注意到获取数据需要几秒钟,而将此数据加载到 table 视图可能需要几分钟。所以,我的问题是:有没有办法中断将数据加载到 table 视图中?我已阅读 table 查看文档中的编程指南,但没有找到任何关于此类内容的信息。

我的目标SDK是10.6。我使用基于单元格的 tableview

您可以通过页面限制和页面偏移值使用加载更多功能。 例如,您在参数中发送页面限制 20,页面偏移量将为 0。 然后 table 视图中有 20 个数据加载。 添加负载更多 functionality.when 用户向下滚动或向上滚动超过 20 个数据然后它将调用。 然后页面偏移量将增加到 1,页面限制将是 20 到 40。

我有一个适合我的解决方案。所以,我所做的是向 NSTableView 添加一个类别 属性: lastRowVisible。我以这种方式覆盖了它的 getter:

- (BOOL)isLastRowVisible
{
    NSRect bounds = self.superview.bounds;
    bounds.origin.y += bounds.size.height - 1;
    NSInteger index = [self rowAtPoint:bounds.origin];
    return index == ([self.dataSource numberOfRowsInTableView:self] - 1);
}

在我的 viewController 中,我添加了一些属性:

@property (nonatomic, assign, readwrite) NSInteger pageNumber;
@property (nonatomic, assign, readwrite) NSInteger pageLimit;
@property (nonatomic, assign, readwrite) BOOL canLoadMoreData;

当我需要将数据加载到 tableView 中时,我会进行这样的操作:

self.pageLimit = kDefaultPageLimit;
self.pageNumber = kDefaultPageNumber;

NSInteger visibleNumberOfRows = (self.pageNumber + 1) * self.pageLimit;
self.myDataArray = DataArray;
self.canLoadMoreData = (self.myDataArray.count < visibleNumberOfRows);

[self.myTableView reloadData];
[self.myTableView scrollRowToVisible:0];

在我的委托方法中,我只检查是否需要加载更多数据:

- (NSInteger)numberOfRowsInTableView:(NSTableView *)tableView
{
    return self.myData.count < self.visibleNumberOfRows ? self.myData.count : self.visibleNumberOfRows;
}

- (NSCell *)tableView:(NSTableView *)tableView dataCellForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row
{   
    if (tableView.lastRowVisible && self.canLoadMoreData)
    {
        self.pageNumber ++;
        if (self.myData.count < self.visibleNumberOfRows)
        {
            self.canLoadMoreData = NO;
        }
        [tableView reloadData];
    }
    // configure and return cell
}

这样的解决方案很适合我,满足我的所有需求。