web-dev-qa-db-fra.com

iOS - Comment faire en sorte que la table utilise la sortie d'API paginée?

Une API que j'écris a environ 2000 enregistrements, renvoyés en JSON via une simple API RESTful que j'ai écrite.

Pour réduire le nombre de problèmes liés à la quantité de données, je souhaite utiliser la pagination afin que je ne retourne que les 10 ou 20 premières demandes par requête, par exemple offset ou limit ou page, etc.

Mais ma question est de savoir comment iOS UITableView sait quand obtenir la page suivante de résultats.

Je ne sais vraiment pas comment faire cela. L'utilisateur peut faire défiler très rapidement et l'API peut ne pas disposer de suffisamment de temps pour extraire 20 ou 50 enregistrements à la fois.

Un autre problème lié à cela est, disons que l'utilisateur défile sur UITableView, puis encore et encore - comment empêcher l'API de se déclencher plusieurs fois pour les mêmes lignes?

Merci

22
zardon

On dirait que vous ne pensez pas en termes de MVC. Votre UITableView a très peu à faire avec la pagination et le webrequest. Cela concerne uniquement sa source de données et non ses pages.

Restuful API Design: Supposons que votre demande Web est conçue comme suit: 

/ getRecorods? pageSize = 20 & pageNo = 2

Cela vous retournera un tableau de JSON. En plus de cela, il est utile d’avoir un paramètre de comptage et un lien vers la page suivante. Cela facilite l'analyse et la synchronisation avec le serveur Web.

comment empêcher l'API de se déclencher plusieurs fois pour les mêmes lignes?

Un simple drapeau suffit pour éviter de charger plusieurs pages. Assurez-vous simplement que cet indicateur est accessible dans le thread principal. La demande en ligne doit être mise en arrière-plan.

Vous trouverez ci-dessous le code que vous devez insérer dans votre UITableViewController qui charge les données.


- (void) viewDidLoad 
 {
 [super viewDidLoad]; 
 // Effectue toute configuration supplémentaire après le chargement de la vue, généralement à partir d'un nœud .

 // appelle http Util ici pour charger les données 
 httpUtil.delegate = self; 

 // Ceci récupère toujours le post pour la première page 
 currentPageNumber = 1; 
 [httpUtil getRecords: currentPageNumber]; 

} 

- (NSInteger) tableView: (UITableView *) tableView numberOfRowsInSection: (NSInteger) section 
 {
 // Retourne le nombre de lignes de la section .
 int retValue = 0; 
 if (recordsArray! = nil) {
 retValue = [recordsArray count]; 
 } 
 return retValue; 
} 

- (UITableViewCell *) tableView: (UITableView *) tableView cellForRowAtIndexPath: (NSIndexPath *) indexPath 
 {
 static NSString * CellIdentifier = @ "Cell"; 

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

 } 

 // Configurez la cellule à l'aide de recordsArray objectAtIndex 

 cellule de retour; 
} 


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

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

 // NSLog (@ "défiler vers le bas!"); 
 if (isPageRefresing == NO) {// inutile de s'inquiéter des threads car ce dernier est toujours sur le thread principal .

 isPageRefresing = YES; 
 [auto showMBProfressHUDOnView: auto.view withText: @ "Veuillez patienter ..."]; 
 currentpagenumber = currentpagenumber +1; 
 [httpUtil getRecords: currentpagenumber]; 
 } 
 } 

} 

 // vous pouvez obtenir la pageNo à partir de tag
// assurez-vous que cela est appelé dans le fil principal 
- (void) didFinishRecordsRequest: (NSArray *) résultats pourPage : (NSInteger) pageNo {
 if (pageNo == 1) {
 recordsArray = [résultats mutableCopy]; 
 } 
 autre{
 [recordsArray addObjectsFromArray: results]; 
 } 
 isPageRefresing = NO; 
 [self.tableView reloadData]; 
} 


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

 // If If Depuis les appels d'actualisation suivants (pour la page 2 ou la page 3 échoue) 
 // puis annule le numéro de page actuel 
 currentpagenumber -; 
 isPageRefresing = NO; 
} 

 // Classe d'utilitaire HTTP 
- (void) getRecords: (NSInteger) pageNumber {

 NSString * serverUrl = [NSString stringWithFormat: @ "http://votrewebsite.com/page/%d /?json",pageNumber];.______. NSLog (@ "extraction des données d'histoires du serveur AVEC L'URL% @", serverUrl); 
 NSURL * url = [NSURL URLWithString: serverUrl]; 
 storiesRequest = [ASIHTTPRequest requestWithURL: url]; 
 storiesRequest.tag = numéro de page; 
 [storiesRequest setDelegate: self]; 
 [storiesRequest startAsynchronous]; 
} 

21
Kunal Balani

Pour Swift

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