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.

2 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?

Hola, al revisar tu código, creo que estas haciendo un par de cosas que no deberián ser,

  1. al hacer el ViewDidLoad no necesitas hacer ReoladData ya que es cuando se inicia el objeto y el propio delegado del UITableView hace un LoadData ya que este método se ejecuta por el propio ciclo de vida del Tableview, respecto a la data que no ves, estas validando que el WebService te regrese los datos actualizados es decir si en el metodo que trae la consulta de los items antes de crear un cita te devuelve 9 items al crear una nueva deberia devolverte 10 ya validaste eso? ami me suena a que el webservice no esta devolviendo la data correcta ya que al no guardar nada, la data solo existe mientras la vista esta viva, y cada vez que entras a la vista el webservice se vuelve a invocar espero haberme explicado.

  2. en este segemento de código verifica :

func itemsCitas(lasCitas: NSArray) {
    //Valdias que el array lasCitas tenga datos? 
      feedItems = lasCitas
    self.citasLista.reloadData()
}
3 Me gusta