2016-08-02 12 views
0

Ich versuche, die richtige Methode zum Paginieren von Ergebnissen mit dem Parse SDK für iOS herauszufinden. Das Problem, das ich habe, ist, dass der Inhalt, den ich versuche zu paginieren, das Potenzial hat, sich häufig zu ändern.Seitennummerierung mit dynamischem Inhalt

Zum Beispiel:

Es ist eine App mit einem Bündel von Objekten auf einem Server gespeichert, und die Anforderung, diese Objekte zu erhalten, ist mit neuesten zuerst und paginierte falls sortiert gibt es eine Menge von Objekten. Wenn der Benutzer scrollt, wenn er sich dem letzten Objekt auf der aktuellen Seite nähert, wird die nächste Seite angefordert.

Nehmen wir an, der Benutzer scrollt zu Seite zwei, dann wird ein neues Objekt zur Liste der Objekte hinzugefügt, und der Benutzer scrollt dann eine weitere Seite hoch. Wenn die nächste Seite angefordert wird, erhalten sie ein Duplikat der letzten Nachricht auf der zweiten Seite, und da Seite 0 bereits geladen wurde, wird das neue Objekt nicht angezeigt.

Wie kann so etwas gehandhabt werden?

Wie würde sich die Implementierung ändern, wenn die Objekte zuerst sortiert wurden?

Vielen Dank im Voraus für die Hilfe.

Edit: Anfrage Pseudocode

- (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. 
    }]; 
} 

Es ist nicht die Anfrage ich Probleme, mich mit, es herauszufinden, wie man richtig in der Tabelle Paging zu handhaben, wenn ein neues Objekt hinzugefügt wird.

+0

können Sie bitte fügen Sie Ihre Abfrage, die die Anfrage behandeln '? –

+0

Der Code ist für ein Client-Projekt, das ich nicht freigeben darf. Ich werde aber etwas Pseudo-Code aufstellen. – RPK

Antwort

0

Was können Sie tun, ist die folgende:

  1. Erstellen Sie eine Abfrage, die 50 Zeilen zurückgeben wird, um
  2. von updatedAt (wie Sie haben)
  3. Wenn Sie das letzte Element aus der Liste nehmen bekommen Ergebnis und sparen Das Element updatedAt in einer globalen Eigenschaft
  4. Verwenden Sie im nächsten Aufruf nicht setOffset, sondern die nächsten 50 Zeilen und fügen Sie eine weitere Bedingung hinzu, wobei updatedAt größer als die aktualisierteAt Ihres globalen Objekts ist. So können Sie sicherstellen, dass Sie nicht doppelte Datensätze in Ihrer Liste haben

Code am Ende wie folgt aussehen sollte:

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]; 
    } 

}]; 

Nun, wenn Sie updatedAt es verwenden ist eine Chance, dass Sie noch Duplikate erhalten, weil annehmen lassen, dass jemand das Objekt ändern, damit auch die updatedAt wird geändert (so wird es größer sein als die updatedAt, die Sie gespeichert) in diesem Fall können Sie createdAt statt updatedAt seit createdAt verwenden werden nie geändert werden

+0

Danke. Das ist definitiv hilfreich. Wie würden Sie mit einem neuen Objekt umgehen, das hinzugefügt wird, nachdem Sie Seite 0 bereits abgerufen haben? (Da der neue Artikel im Index 0 der Seite 0 sein würde) – RPK

+0

Sie sortieren die Elemente in aufsteigender Reihenfolge, so dass neue Objekte unten sein werden –

+0

Danke. Dies scheint eine akzeptable Antwort zu sein. – RPK