2016-08-02 1 views
0

J'essaie de trouver la bonne façon de paginer les résultats en utilisant le Parse SDK pour iOS. Le problème que j'ai est que le contenu que j'essaie de paginer a le potentiel de changer fréquemment.Pagination avec contenu dynamique

Par exemple:

Il y a une application avec un tas d'objets stockés sur un serveur, et la demande pour obtenir ces objets est triés par ordre récent et paginé au cas où il y a beaucoup d'objets. Lorsque l'utilisateur défile, à l'approche du dernier objet de la page en cours, la page suivante est demandée.

Dites que l'utilisateur fait défiler la page deux, puis un nouvel objet est ajouté à la liste des objets et l'utilisateur fait défiler une autre page. Lorsque la page suivante est demandée, ils recevront une copie du dernier message sur la deuxième page, et comme la page 0 a déjà été chargée, le nouvel objet ne sera pas affiché.

Comment peut-on traiter quelque chose comme ça?

Comment l'implémentation changerait-elle si les objets étaient triés les plus anciens en premier?

Merci d'avance pour l'aide.

Edit: demande de code pseudo

- (void)fetchObjectsForPage:(NSUInteger)page completion:(void (^)(NSArray *_Nullable objects, PageInfo *_Nullable pageInfo, NSError *_Nullable error))completion{ 
    PFQuery *query = [SomeObject query]; 
    [query orderByAscending:@"updatedAt"]; 
    [query setLimit:50]; 
    [query setSkip:50 * page]; 
    [query findObjectsInBackgroundWithBlock:^{NSArray *_Nullable objects, NSError *_Nullable error){ 
     ... 
     >>> Do error checking and return array along with paging info (total number of objects, page size) or error in completion block. 
    }]; 
} 

Ce n'est pas la demande que je vais avoir du mal avec, il est à comprendre comment gérer correctement la pagination dans la table lorsqu'un nouvel objet est ajouté.

+0

pouvez-vous s'il vous plaît collez votre requête qui gèrent la demande '? –

+0

Le code est pour un projet client dont je ne suis pas autorisé à partager. Je vais mettre un code pseudo bien. – RPK

Répondre

0

Ce que vous pouvez faire est la suivante:

  1. Créer une requête qui renverra 50 lignes (comme vous l'avez fait) commande par updatedAt
  2. Lorsque vous obtenez Jète le dernier élément de la liste et économisez l'élément updatedAt dans une propriété globale
  3. Dans l'appel suivant, n'utilisez pas setOffset mais obtenez les 50 lignes suivantes et ajoutez une autre condition où updatedAt est supérieur à updatedAt de votre objet global. De cette façon, vous assurez-vous que vous ne serez pas avoir des doublons dans votre liste

A la fin de votre code devrait ressembler à ce qui suit:

PFQuery *query = [PFQuery queryWithClassName:@"SomeClassName"]; 
[query orderByAscending:@"updatedAt"]; 
[query setLimit:50]; 

if (self.lastItemUpdatedAt){ 
    [query whereKey:@"updatedAt" greaterThan:self.lastItemUpdatedAt]; 
} 

[query findObjectsInBackgroundWithBlock:^(NSArray * _Nullable objects, NSError * _Nullable error) { 

    if (objects.count > 0){ 
     self.lastItemUpdatedAt = [[objects lastObject] updatedAt]; 
    } 

}]; 

Maintenant, si vous utilisez updatedAt il y a une chance que vous sera toujours obtenir des doublons parce que nous supposons que quelqu'un changer l'objet de sorte que le updatedAt sera également modifié (il sera plus grand que le updatedAt que vous avez enregistré) dans ce cas, vous pouvez utiliser createdAt au lieu de updatedAt depuis createdAt volonté ne jamais être changé

+0

Merci. C'est vraiment utile. Comment gérez-vous un nouvel objet ajouté après que vous avez déjà récupéré la page 0? (Puisque le nouvel élément serait à l'index 0 de la page 0) – RPK

+0

Vous trier les éléments en ordre croissant de sorte que les nouveaux objets seront au fond –

+0

Merci. Cela semble être une réponse acceptable. – RPK