2017-07-27 5 views
0

J'ai une application, il a une base de données (et une base de données dans un serveur). Quand j'ouvre l'application, elle appelle une fonction qui obtient des informations d'un serveur et stocke les informations dans ma base de données locale (j'utilise SQliteSwift) et quand j'ouvre la vue, la table est vide, puis je ferme/retourne et rouvrir la vue et tout est là. J'ai donc implémenté un bouton d'actualisation, lorsque j'ajoute un nouvel enregistrement à la base de données de mon serveur puis que j'appelle la fonction Actualiser pour recharger les données, l'application se bloque en disant que le tableau dans lequel je stocke mes informations est hors limites. Cela peut être dû au fait que j'ai mis à jour le serveur, mais pas ma base de données locale, donc lorsque je fais la fonction d'actualisation, il essaie à nouveau de charger l'information.viewDidLoad et viewWillAppear. Télécharger les données du serveur et mettre à jour la tableVoir

Je pensais que, peut-être je devrais mettre la fonction d'actualisation et la fonction qui récupère les informations du serveur dans un viewWillAppear (au lieu de viewDidLoad, parce que je l'ai là). Qu'en pensez-vous? viewWillAppear est-il nécessaire dans ce cas?

MIS À JOUR

J'ai oublié de mentionner que j'ai la fonction qui appelle le serveur dans un autre vue (il est un bouton et lorsque vous cliquez dessus, il appelle la fonction et ouvre la vue avec le tableView)

le code de la classe tableView ressemble à la suivante ...

//Create arrays where the information will be stored 
var numPoliza = [String]() 
var vigencia = [String]() 
var inicioVigencia = [String]() 
var statusTabla = [String]() 
var nombres = [String]() 
var apellidos = [String]() 
var ids = [String]() 

//Refresher 
var refresh: UIRefreshControl! 

//My viewDidLoad where I call the function that connects to the server 
override func viewDidLoad() { 
    super.viewDidLoad() 
    do{ 
     for consulta in try conn.db!.prepare(tblPoliza){ 
      numPoliza.append(String(consulta[numeroPoliza])) 
      vigencia.append(String(consulta[fechaExpiracion])) 
      inicioVigencia.append(String(consulta[fechaCreacion])) 
      statusTabla.append(String(consulta[status])) 
     } 
    } 
    catch{ 
     //Errors thrown 
    } 

    do{ 
     let query = tblPersona.select(tblPersona[nombre], tblPersona[id], tblPersona[apaterno]) 
      .join(tblPoliza, on: tblPersona[id] == tblPoliza[idCliente]) 
     for datos in try conn.db!.prepare(query){ 
      nombres.append(datos[nombre]!) 
      apellidos.append(datos[apaterno]!) 
      ids.append(String(datos[id])) 
     } 
    } 
    catch{ 
     //Errors thrown 
    } 

    //Refresher that calls the function from below 
    refresh = UIRefreshControl() 
    refresh.attributedTitle = NSAttributedString(string: "Estira para actualizar") 
    refresh.addTarget(self, action: #selector(ConsultaPolizas.getInfoDesdeBD), for: UIControlEvents.valueChanged) 
    tablaView.addSubview(refresh) 

} 


//Refresh function that Calls the Database and appends the information into the arrays 
func getInfoDesdeBD(){ 
    do{ 
     for consulta in try conn.db!.prepare(tblPoliza){ 
      numPoliza.append(String(consulta[numeroPoliza])) 
      vigencia.append(String(consulta[fechaExpiracion])) 
     } 
    } 
    catch{ 
     //Errors thrown 
    } 
    tablaView.reloadData() 
    refresh.endRefreshing() 
} 

Et, le bouton (à une autre fonction) qui appelle la fonction qui obtient les informations du serveur.

@IBAction func consultaPolizas(_ sender: Any) { 
    //Imprime polizas 
    for usuario in arregloIds { 
    addHospitalMap.addPin.muestraPolizaWeb(numeroID: usuario) 
    } 
    self.performSegue(withIdentifier: "poliza", sender: self) 

} 
+1

Pourriez-vous s'il vous plaît mettre du code pour cela? Essayez de le déboguer avec des points de rupture et voyez ce qui se passe. – Singhal2

+0

Peu importe à quelle fonction vous accédez un index de tableau après ses limites - cela aura toujours une exception. La clé est de mettre à jour votre tableau ET tout ce que vous utilisez pour générer des index en même temps. –

+0

@ Singhal2 J'ai mis à jour la question et ajouté le code –

Répondre

0

Vous devez vider la baie au début de la fonction d'actualisation. Par exemple:

fun refresh() 
{ 
    myArray.removeAll() 
} 
+0

J'ai oublié de mentionner que la fonction qui obtient l'information du serveur est située dans une autre vue, ce qui pourrait être la raison pour laquelle je recharge la page en dehors des limites, parce que la fonction n'est pas appelée à nouveau. J'ajouterai également 'removeAll()' à refresh() –