【发布时间】:2017-07-27 18:18:01
【问题描述】:
我有一个应用程序,它有一个数据库(以及服务器中的一个数据库)。当我打开应用程序时,它会调用一个函数,该函数从服务器获取信息并将信息存储在我的本地数据库中(我使用的是 SQliteSwift),当我打开视图时,表是空的,然后我关闭/返回并重新打开视图,一切都在那里。所以我实现了一个刷新按钮,当我向服务器的数据库添加一条新记录,然后调用刷新函数重新加载数据时,应用程序崩溃,说我存储信息的数组超出了范围。这可能是因为我更新了服务器,但没有更新我的本地数据库,所以当我执行刷新功能时,它会尝试再次加载信息。
我在想,也许我应该将刷新函数和从服务器检索信息的函数放在 viewWillAppear 中(而不是 viewDidLoad,因为我有它)。你们有什么感想?在这种情况下需要 viewWillAppear 吗?
更新
我忘了提到我有一个在不同视图中调用服务器的函数(它是一个按钮,单击它会调用该函数并使用 tableView 打开视图)
tableView 类的代码如下...
//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()
}
并且,调用从服务器获取信息的函数的按钮(来自其他函数)。
@IBAction func consultaPolizas(_ sender: Any) {
//Imprime polizas
for usuario in arregloIds {
addHospitalMap.addPin.muestraPolizaWeb(numeroID: usuario)
}
self.performSegue(withIdentifier: "poliza", sender: self)
}
【问题讨论】:
-
您能为此输入一些代码吗?尝试用断点调试它,看看发生了什么。
-
无论您访问数组索引的哪个函数超出了它的界限——它总是会有一个异常。关键是更新你的数组和你用来同时生成索引的任何东西。
-
@Singhal2 我更新了问题并添加了代码
标签: swift xcode viewdidload viewwillappear