objective c - NSTableView Reload Data

时间:2016-10-26 16:50:36

标签: objective-c macos tableview nstableview osx-snow-leopard

我正在开发一个与tableview一起使用的应用程序。我需要将非常大量的数据加载到我的表视图中(最多500k元素)。当我加载数据时,我在另一个视图上显示动画。动画在主线程中运行。加载数据在后台线程上。我也在后台线程的表视图中执行重载数据。但我希望能够取消此操作。

我注意到的是,获取数据会持续几秒钟,而将这些数据加载到表格视图中可能需要几分钟。所以,我的问题是:有没有办法中断将数据加载到表视图中?我在文档中读过tableview编程指南,但没有发现任何关于此类事情的内容。

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

2 个答案:

答案 0 :(得分:1)

我有一个适合我的解决方案。所以,我所做的是为NSTableView添加一个类别,其中包含一个属性:lastRowVisible。我以这种方式超越了它的吸气剂:

- (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
}

这样的解决方案对我来说很好,适合我的所有需求。

答案 1 :(得分:0)

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