2016-10-26 6 views
0

Я разрабатываю приложение, которое работает с tableview. Мне нужно загрузить ОЧЕНЬ ОГРОМНОЕ количество данных в мое представление таблицы (до 500 тыс. Элементов). Когда я загружаю данные, я показываю анимацию на другом представлении. Анимация выполняется в основном потоке. Загрузка данных осуществляется по фоновому потоку. И я также выполняю перезагрузку данных в виде таблицы в фоновом потоке. Но я хочу, чтобы можно было отменить эту операцию.Объектив c - NSTableView Обновить данные

И я заметил, что извлечение моих данных длится несколько секунд, в то время как загрузка этих данных в виде таблицы может занять до минуты. Итак, мой вопрос: есть ли способ прервать загрузку данных в виде таблицы? Я прочитал руководство по программированию таблиц в документации, но ничего не нашел о таких вещах.

Мой целевой SDK - 10.6. Я использую табличное представление на сотовой основе

+2

Когда вы говорите, что вы загружаете данные в таблицу, что вы имеете в виду? Можете ли вы показать нам свой код? – Caleb

+0

Я имею в виду '[tableView reloadData]' –

ответ

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 
} 

Такое решение отлично подходит для меня и соответствует всем моим потребностям.

+0

'reloadData' внутри' dataCellForTableColumn' не может быть прав. Используйте методы NSTableViewDataSource для данных. – Willeke

0

Вы можете использовать дополнительную функциональность загрузки с ограничением страницы и значением смещения страницы. , например, вы отправляете предел страницы 20 в свой параметр, а смещение страницы равно 0. . Тогда в представлении таблицы есть 20 данных. Добавьте нагрузку больше функциональности. Когда пользователь прокручивает вниз или прокручивает вверх выше 20 данных, тогда он будет вызывать. Затем смещение страницы будет увеличиваться до 1, а предел страницы будет от 20 до 40.

+0

вы можете показать пример? –

 Смежные вопросы

  • Нет связанных вопросов^_^