我正在开发一个与tableview一起使用的应用程序。我需要将非常大量的数据加载到我的表视图中(最多500k元素)。当我加载数据时,我在另一个视图上显示动画。动画在主线程中运行。加载数据在后台线程上。我也在后台线程的表视图中执行重载数据。但我希望能够取消此操作。
我注意到的是,获取数据会持续几秒钟,而将这些数据加载到表格视图中可能需要几分钟。所以,我的问题是:有没有办法中断将数据加载到表视图中?我在文档中读过tableview编程指南,但没有发现任何关于此类事情的内容。
我的目标SDK是10.6。我使用基于单元格的tableview
答案 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。