it-roy-ru.com

iOS - Как заставить просмотр таблицы использовать постраничный вывод API?

API, который я пишу, содержит около 2000 записей, возвращаемых в JSON через простой RESTful API, который я написал.

Чтобы уменьшить проблемы с большим количеством данных, я хочу использовать нумерацию страниц, чтобы я возвращал, скажем, только первые 10 или первые 20 за запрос, например, offset или limit или page и т.д.

Но мой вопрос: как iOS UITableView узнает, когда получить следующую страницу результатов?

Я действительно не уверен, как это сделать. Пользователь может выполнять прокрутку слишком быстро, поэтому у API может не хватить времени для получения 20 или 50 записей одновременно.

Еще одна проблема, связанная с этим, скажем, пользователь прокручивает UITableView вниз, затем вверх и затем снова вниз - как вы предотвращаете многократное срабатывание API для одних и тех же строк?

Спасибо

22
zardon

Кажется, вы не думаете с точки зрения MVC. Ваш UITableView имеет мало общего с подкачкой страниц и веб-запросами. Он просто обеспокоен своим источником данных, а не страницами.

Restuful API Design: Предположим, ваш веб-запрос разработан следующим образом: 

/ GetRecorods? PAGESIZE = 20 & pageNo = 2

Это вернет вам массив JSON. В дополнение к этому полезно иметь параметр count и ссылку на следующую страницу. Это помогает в разборе и синхронизации с веб-сервером.

как вы предотвращаете многократное срабатывание API для одних и тех же строк?

Простого флага достаточно, чтобы избежать загрузки нескольких страниц. Просто убедитесь, что флаг доступен в основном потоке. Фактический веб-запрос должен идти в фоновом потоке.

Ниже приведен код, который вы должны поместить в свой UITableViewController, который загружает данные

- (void) viewDidLoad 
 {
 [super viewDidLoad]; 
 // Выполнить любую дополнительную настройку после загрузки представления, как правило, из кончика .

 // вызвать http Util здесь для загрузки данных 
 httpUtil.delegate = self; 

 // Всегда получает сообщение для первой страницы 
 currentPageNumber = 1; 
 [httpUtil getRecords: currentPageNumber]; 

} 

- (NSInteger) tableView: (UITableView *) tableView numberOfRowsInSection: (NSInteger) раздел 
 {
 // Возвращаем количество строк в разделе .
 int retValue = 0; 
 if (recordsArray! = nil) {
 retValue = [recordsArray count]; 
 } 
 return retValue; 
} 

- (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath 
 {
 статическая NSString * CellIdentifier = @ "Cell"; 

 CustomCell * cell = [tableView dequeueReusableCellWithIdentifier: CellIdentifier]; 
 if (cell == nil) {

 } 

 // Настройка ячейки с использованием recordsArray objectAtIndex 

 возвратная ячейка; 
} 


- (void) scrollViewDidScroll: (UIScrollView *) scrollView {

 if (self.tableView.contentOffset.y> = (self.tableView.contentSize.height - self.tableView.bounds.size.height)) {

 // NSLog (@ "scroll to bottom!"); 
 if (isPageRefresing == NO) {// не нужно беспокоиться о потоках, потому что это всегда в основном потоке .

 isPageRefresing = YES; 
 [self showMBProfressHUDOnView: self.view withText: @ "Пожалуйста, подождите ..."]; 
 currentpagenumber = currentpagenumber +1; 
 [httpUtil getRecords: currentpagenumber]; 
 } 
 } 

} 

 // вы можете получить pageNo из tag
// убедитесь, что он вызывается в главном потоке 
- (void) didFinishRecordsRequest: (NSArray *) результаты forPage : (NSInteger) pageNo {
 if (pageNo == 1) {
 recordsArray = [results mutableCopy]; 
 } 
 еще {
 [recordsArray addObjectsFromArray: results]; 
 } 
 isPageRefresing = NO; 
 [self.tableView reloadData]; 
} 


- (void) didFailedChalkBoardRequestWithError: (NSError *) error {

 // Если с тех пор последующие вызовы обновления (для страницы 2 или страницы 3 не удается) 
 // затем отменяем текущий номер страницы 
 currentpagenumber -; 
 isPageRefresing = NO; 
} 

 // Класс служебной программы HTTP 
- (void) getRecords: (NSInteger) pageNumber {

 NSString * serverUrl = [NSString stringWithFormat: @ "http://yourwebsite.com/page/%d /?json",pageNumber];

 NSLog (@ "получение данных историй с сервера WITH URL% @", serverUrl); 
 NSURL * url = [NSURL URLWithString: serverUrl]; 
 StoriesRequest = [ASIHTTPRequest requestWithURL: url]; 
 StoriesRequest.tag = pageNumber; 
 [StoriesRequest setDelegate: self]; 
 [StoriesRequest startAsynchronous]; 
} 

21
Kunal Balani

Для Свифта

func scrollViewDidScroll(scrollView: UIScrollView) {
        if collectionViewGif.contentOffset.y >= self.collectionViewGif.contentSize.height - self.collectionViewGif.frame.size.height
        {
            offset = offset + 1
            self.fetchGifWithPaination(defaultText)
        }
    }
0
Maninderjit Singh