Cómo recargo una tableview?

Hola buenas noches, me atrevo a escribir aquí para ver si me pueden ayudar con un detalle que tengo a la hora de hacer una consulta y descargar un arreglo que pueden llegar a tener cambios, en resumidas palabras, al hacer un registro nuevo me gustaría que se haga una nueva consulta a mi API para descarga los nuevos datos. Agradezco todo comentario, muchas gracias, saludos a todos.

Para esto uso Modelo y Protocolo.
CitasDetalles.swift
import UIKit

class DetallesCitas: NSObject {

var idCitaCliente: String?
var nombreCitaCliente: String?
var idClienteCita: String?
var horarioCita: String?
var fechaCita: String?
var citaStatus: String?
var citaServicio: String?
var citaBarbero: String?

override init(){
    
}

init(idCitaCliente: String, nombreCitaCliente: String, idClienteCita:String, horarioCita:String, fechaCita: String, citaStatus: String, citaServicio: String, citaBarbero: String) {
    
    self.idCitaCliente = idCitaCliente
    self.nombreCitaCliente = nombreCitaCliente
    self.idClienteCita = idClienteCita
    self.horarioCita = horarioCita
    self.fechaCita = fechaCita
    self.citaStatus = citaStatus
    self.citaBarbero = citaBarbero
    
}

override var description: String{
    
    return "idCitaCliente: \(idCitaCliente), nombreCitaCliente: \(nombreCitaCliente), idClienteCita: \(idClienteCita), horarioCita: \(horarioCita), fechaCita: \(fechaCita), citaStatus: \(citaStatus), citaServicio: \(citaServicio), citaBarbero: \(citaBarbero)"
}

}

CitasModelo.swift

import UIKit
protocol CitasModeloProtocol: class {

func itemsCitas(lasCitas: NSArray)

}

let idCliente: String = UserDefaults.standard.string(forKey: “id”)!

class CitasModelo: NSObject {

weak var elDelegado: CitasModeloProtocol!

let urlPath = "http://sistema.gents.mx/movilBackendGENTS/listaCitasCliente.php?idCliente=\(idCliente)"

func downloadItems(){
    
    let url: URL = URL(string: urlPath)!
    let defaultSession = Foundation.URLSession(configuration: URLSessionConfiguration.default)
    let task = defaultSession.dataTask(with: url){
        (data, response, error) in
        if error != nil{
            
            print("Error al descargas las citas")
        
        }else{
            
            print("Datos descargados")
            
            self.parseJSON(data!)
            

        }
    }
    
    task.resume()
    
}



func parseJSON(_ data:Data){
    
    var resultFromServer: Any?
    resultFromServer = try? JSONSerialization.jsonObject(with: data, options: [])
    
    if let respdict = resultFromServer as? [String : Any] {
        //respone in dictionary format
        
        var jsonDi = NSDictionary()
        
        do{
            
            jsonDi = try JSONSerialization.jsonObject(with: data, options: .allowFragments) as! NSDictionary
            
            let parsedJSON = jsonDi
            if parsedJSON["status"] as! String == "401"{
                
                print(parsedJSON["message"] as! String)
                
            }
            
        } catch {
            
            
        }
        

        
    }
        
    else if let respArr = resultFromServer as? [Any]{
        //response is array type
            var jsonResult = NSArray()
        do{
            
            jsonResult = try JSONSerialization.jsonObject(with: data, options: JSONSerialization.ReadingOptions.allowFragments) as! NSArray
            
        } catch let error as NSError {
            
            print(error)
        }
        
        var jsonElement = NSDictionary()
        let detalles = NSMutableArray()
        for i in 0 ..< jsonResult.count{
            
            jsonElement = jsonResult[i] as! NSDictionary
            let detalle = DetallesCitas()
            
            let idCitaCliente = jsonElement["id"]
            let nombreCitaCliente = jsonElement["usuarioCita"]
            let idClienteCita = jsonElement["idCliente"]
            let horarioCita = jsonElement["citaHorario"]
            let fechaCita = jsonElement["citaDia"]
            let citaStatus = jsonElement["statusCitas"]
            let citaServicio = jsonElement["citaServicio"]
            let citaBarbero = jsonElement["barberoCita"]
            
            detalle.idCitaCliente = idCitaCliente as? String
            detalle.nombreCitaCliente = nombreCitaCliente as? String
            detalle.idClienteCita = idClienteCita as? String
            detalle.horarioCita = horarioCita as? String
            detalle.fechaCita = fechaCita as? String
            detalle.citaStatus = citaStatus as? String
            detalle.citaServicio = citaServicio as? String
            detalle.citaBarbero = citaBarbero as? String
            
            detalles.add(detalle)
            
        }
        
        DispatchQueue.main.async(execute: { ()-> Void in
            
            self.elDelegado.itemsCitas(lasCitas: detalles)
        })
        
    }
        
    else if let stringRespt = String(data: data, encoding: .utf8){
        //resp is string
    }
    

}

}

ListaCitasVC.swift

import UIKit

class ListaCitasVC: UIViewController, UITableViewDataSource, UITableViewDelegate, CitasModeloProtocol {

var feedItems: NSArray = NSArray()
var selectCita : DetallesCitas = DetallesCitas()

@IBOutlet weak var citasLista: UITableView!

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    citasLista.reloadData()
}

override func viewDidLoad() {
    super.viewDidLoad()
    
    self.citasLista.delegate = self
    self.citasLista.dataSource = self
    
    let citasModelo = CitasModelo()
    citasModelo.elDelegado = self
    citasModelo.downloadItems()
    self.citasLista.reloadData()
    // Do any additional setup after loading the view.
}

func itemsCitas(lasCitas: NSArray) {
    feedItems = lasCitas
    self.citasLista.reloadData()
}

func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return feedItems.count
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "celdaCitas", for: indexPath) as! CitasTVC
    let item: DetallesCitas = feedItems[indexPath.row] as! DetallesCitas
    
    cell.lblHoraCita!.text = item.horarioCita
    cell.lblFechaCita!.text = item.fechaCita
    cell.lblStatusCitas!.text = item.citaStatus
    cell.lblServicioCita!.text = item.citaServicio
    cell.lblBarbero!.text = item.citaBarbero
    
    return cell
    
}

/*
// MARK: - Navigation

// In a storyboard-based application, you will often want to do a little preparation before navigation
override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
    // Get the new view controller using segue.destination.
    // Pass the selected object to the new view controller.
}
*/

}

Hay varias formas en las que puedes solicitar los nuevos datos, por un Notification, Scroll down to refresh o con Timers, eso ya depende mucho del diseño de tu aplicación. Lo mas común en el Scroll down to refresh el cual ya viene integrado en el tableview como delegados solo es implementarlo.

1 me gusta

Hola, agradezco tu respuesta y el haber leído el código. En esta app hay un formulario para crear citas y cuando el usuario llena el formulario y se envía la información al servidor para visualizar ese registro en la uitableview, al hacer todo el registro e ir al tableview donde se almacenan las citas registradas el tableview no lo muestra, tendría que desinstalar la aplicación y volver a instalarla para que la applicación haga todo el proceso de descargar los datos desde el servidor, si cierro y abro la app no hace la función de descargar los datos. Gracias, saludos.

Estas usando CoreData para almacenar los datos que recibes y mostrarlos en la tabla?