viewDidLoad和viewWillAppear。从服务器下载数据并更新tableView

时间:2017-07-27 18:18:01

标签: swift xcode viewdidload viewwillappear

我有一个App,它有一个数据库(和服务器中的数据库)。当我打开应用程序时,它调用一个函数从服务器获取信息并将信息存储在我的本地数据库中(我正在使用SQliteSwift),当我打开View时,表是空的,然后我关闭/返回重新打开视图,一切都在那里。所以我实现了一个刷新按钮,当我向服务器的DB添加一条新记录,然后调用Refresh函数重新加载数据时,App崩溃说我存储信息的数组超出了界限。这可能是因为我更新了服务器,但没有更新我的本地数据库,因此当我执行刷新功能时,它会尝试再次加载信息。

我在想,也许我应该把一个刷新功能和从服务器中检索信息的函数放在viewWillAppear中(而不是viewDidLoad,因为我有它)。你们有什么感想?在这种情况下需要viewWillAppear吗?

已更新

我忘了提到我有一个在不同View中调用服务器的函数(它是一个按钮,点击它时会调用该函数并用tableView打开View)

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)

}

1 个答案:

答案 0 :(得分:0)

您需要在刷新功能开始时清空数组。例如:

fun refresh()
{
    myArray.removeAll()
}