wake-up-neo.com

iOS - Wie kann man die Tableview mit paginierter API-Ausgabe ausstatten

Eine API, die ich schreibe, hat etwa 2000 Datensätze, die in JSON über eine einfache RESTful-API zurückgegeben wurden, die ich geschrieben habe.

Um Probleme mit vielen Daten zu vermeiden, möchte ich die Paginierung verwenden, sodass ich nur die ersten 10 oder die ersten 20 pro Anfrage über offset oder limit oder page zurücksende.

Aber meine Frage ist, wie das iOS UITableView weiß, wann die nächste Ergebnisseite angezeigt wird.

Ich bin mir wirklich nicht sicher, wie ich das machen soll. Der Benutzer kann sehr schnell scrollen, und die API hat möglicherweise nicht genügend Zeit, um 20 oder 50 Datensätze gleichzeitig abzurufen.

Ein anderes Problem im Zusammenhang damit ist, sagen wir, der Benutzer scrollt in der UITableView nach unten, dann nach oben und dann wieder nach unten - wie verhindern Sie, dass die API mehrere Male für die gleichen Zeilen ausgelöst wird?

Vielen Dank

22
zardon

Es scheint so, als würden Sie nicht in MVC denken. Ihre UITableView hat sehr wenig mit Paging und Webanfragen zu tun. Es geht nur um die Datenquelle, nicht um Seiten.

Wiederherstellen des API-Designs: Angenommen, Ihre Webanforderung ist wie folgt aufgebaut: 

/ getRecorods? pageSize = 20 & pageNo = 2

Dies gibt Ihnen ein Array von JSON zurück. Darüber hinaus ist es hilfreich, einen Zählerparameter und einen Link zur nächsten Seite zu haben. Dies hilft beim Analysieren und Synchronisieren mit dem Webserver.

wie verhindern Sie, dass die API für dieselben Zeilen mehrmals ausgelöst wird?

Ein einfaches Flag reicht aus, um das Laden mehrerer Seiten zu vermeiden. Stellen Sie einfach sicher, dass im Haupt-Thread auf das Flag zugegriffen wird. Die eigentliche Webanforderung muss in den Hintergrundthread gehen.

Nachfolgend finden Sie den Code, den Sie in Ihren UITableViewController eingeben müssen, der die Daten lädt

- (void) viewDidLoad 
 {
 [super viewDidLoad]; 
 // Nehmen Sie nach dem Laden der Ansicht weitere Einstellungen vor, normalerweise über eine Spitze .

 // Rufe http Util hier auf, um die Daten zu laden 
 httpUtil.delegate = self; 

 // Hiermit wird der Beitrag für die erste Seite immer abgerufen 
 currentPageNumber = 1; 
 [httpUtil getRecords: currentPageNumber]; 

} (NSInteger) tableView: (UITableView *) tableView numberOfRowsInSection: (NSInteger) Abschnitt 
 {
 // Liefert die Anzahl der Zeilen im Abschnitt .
 int retValue = 0; 
 if (recordsArray! = null) {
 retValue = [Anzahl der DatensätzeArray]; 
 } 
 return retValue; 
} 

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

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

 } 

 // Konfigurieren Sie die Zelle mithilfe von recordsArray objectAtIndex 

 return cell; 
} 


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

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

 // NSLog (@ "nach unten scrollen!"); 
 if (isPageRefresing == NO) {// Sie müssen sich nicht um Threads kümmern, da sich dieser immer im Haupt-Thread befindet .

 isPageRefresing = YES; 
 [self showMBProfressHUDOnView: self.view withText: @ "Bitte warten ..."]; 
 Stromnummer = Stromnummer +1; 
 [httpUtil getRecords: currentpagenumber]; 
 } 
 } 

} 

 // Sie können pageNo von tag
// abrufen. Stellen Sie sicher, dass dies im Haupt-Thread aufgerufen wird 
- (void) : (NSInteger) pageNo {
 if (pageNo == 1) {
 recordsArray = [Ergebnisse mutableCopy]; 
 } 
 sonst{
 [recordsArray addObjectsFromArray: Ergebnisse]; 
 } 
 isPageRefresing = NO; 
 [self.tableView reloadData]; 
} 


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

 // If Since nachfolgende Aktualisierungsaufrufe (für Seite 2 oder Seite 3 schlagen fehl) 
 // mache dann die aktuelle Seitennummer rückgängig 
 aktuelleSeitennummer -; 
 isPageRefresing = NO; 
} 

 // HTTP-Dienstprogrammklasse 
- (void) getRecords: (NSInteger) pageNumber {

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

 NSLog (@ "holt Stories-Daten von Server WITH URL% @", serverUrl); 
 NSURL * url = [NSURL URLWithString: serverUrl]; 
 storiesRequest = [ASIHTTPRequest requestWithURL: url]; 
 storiesRequest.tag = Seitennummer; 
 [storiesRequest setDelegate: self]; 
 [storiesRequest startAsynchronous]; 
} 

21
Kunal Balani

Für 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