2016-11-12 2 views
0

Ich möchte eine Liste von Übungen in eine Tabellenansicht importieren. Ich habe es funktioniert, um die erste Seite zu importieren, aber das ist nur eine Handvoll Übungen. Der JSON scheint Links zur nächsten Seite zu haben, und ich möchte sie alle laden können, wenn ich den Ladevorgang starte.Umgang mit einem mehrseitigen JSON und TableView?

Müsste ich irgendeine Art von if else-Anweisung verwenden, um aufeinanderfolgende Seiten zu laden, wenn sie existieren, andernfalls end loading?

Das ist mein API-Service

open class ApiService: NSObject { 

open func getData(completionHandler: @escaping (NSDictionary?, NSError?) -> Void) -> Self { 

    let requestUrl = "https://wger.de/api/v2/exercise/?format=json" 

    Alamofire.request(requestUrl, method: .get, encoding: URLEncoding.default) 
     .responseJSON { response in 
      switch response.result { 
      case .success(let data): 

       completionHandler(data as? NSDictionary, nil) 

      case .failure(let error): 
       print("Request failed with error: \(error)") 
       completionHandler(nil, error as NSError?) 
      } 
    } 
    return self 
} 

}

Dies ist meine JSON, die eindeutig auf der folgenden Seite in der ersten Zeile dieses

https://wger.de/api/v2/exercise/?format=json

verweist ist meine Tabellenansicht, die Daten in i zieht f relevant

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) 
    if (searchActive){ 
     cell.textLabel?.text = filtered[indexPath.row] 
    } else { 
     if let row: NSDictionary = arrRes[indexPath.row] as NSDictionary? { 

      guard let name = row["name"] as? String else { 
       print("Fail") 
       return cell 
      } 
      cell.textLabel?.text = name 
     } 
    } 
    return cell 
} 

Danke für ein paar Tipps!

Antwort

0

Sie könnten die nächste Übungsseite in den Hintergrund laden und sie dann zum Ergebnis-Array hinzufügen (arrRes in Ihrem Fall), wenn die Anfrage abgeschlossen ist.

Dann, wenn Sie rufen tableView.reloadRows(at: [IndexPath], with: UITableViewRowAnimation) mit den Indizes der neuen Ergebnisse sollte der Tabellenansicht in die neuen Ergebnisse animieren.

+0

Klingt gut, aber ich habe keine Ahnung, wie dies zu tun ist, was die erste Frage war – infernouk

0

auf die gleiche Weise hier hat den Namen Eigenschaft aus der JSON-Datei erhalten

guard let name = row["name"] as? String else { 
    print("Fail") 
    return cell 
} 

Wo immer Sie wollen die nächste Seite etwas tun, wie

// data is the json result you have from the first request 
func lookForNextPage(data: NSDictionary, completionHandler: @escaping (NSDictionary?, NSError?) -> Void) { 
    // Try and see if a next page exist 
    if let nextPage = data["next"] as? String { 
     // There is a next page, fetch it and add result to datasource 
     Alamofire.request(requestUrl, method: .get, encoding: URLEncoding.default) 
      .responseJSON { response in 
       switch response.result { 
       case .success(let data): 
        // Handle the new data as you wish 
        completionHandler(data as? NSDictionary, nil) 

       case .failure(let error): 
        print("Request failed with error: \(error)") 
        completionHandler(nil, error as NSError?) 
       } 
     } 
    } 
} 

Gut laden, passen sie einfach auf Ihre nee ds

Verwandte Themen