【问题标题】:viewDidLoad and viewWillAppear. Download data from server and update tableViewviewDidLoad 和 viewWillAppear。从服务器下载数据并更新 tableView
【发布时间】: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


【解决方案1】:

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

func refresh() {
    myArray.removeAll()
}

【讨论】:

  • 我忘了提到从服务器获取信息的函数位于另一个视图中,这可能是我重新加载页面时显示超出范围的原因,因为该函数不是再次调用。我还将 removeAll() 添加到 refresh()
猜你喜欢
  • 2016-09-07
  • 1970-01-01
  • 1970-01-01
  • 2017-02-08
  • 2015-09-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多