2017-07-27 9 views
0

私はAppを持っています。それはデータベース(およびサーバー内のデータベース)を持っています。アプリケーションを開くと、サーバーから情報を取得し、ローカルデータベースに情報を格納する関数を呼び出します(私はSQliteSwiftを使用しています)。ビューを開くと、テーブルは空です。ビューを再度開いて、すべてが表示されます。サーバーのDBに新しいレコードを追加し、データをリロードするためにリフレッシュ関数を呼び出すと、リフレッシュボタンが実装されました。アプリケーションがクラッシュし、情報を格納している配列が範囲外です。これはサーバーを更新したがローカルデータベースが更新されていない可能性があります。そのため、リフレッシュ機能を使用すると、情報を再度ロードしようとします。viewDidLoadとviewWillAppear。サーバーからデータをダウンロードしてテーブルビューを更新する

私はリフレッシュ機能と、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) 

} 
+1

このコードを入力してください。ブレークポイントでデバッグして、何が起きているのかを確認してください。 – Singhal2

+0

配列インデックスにアクセスする関数は、その関数の境界を超えてアクセスしても問題ありません。常に例外があります。キーは、あなたの配列を更新し、インデックスを同時に生成するために使用しているものを更新することです。 –

+0

@ Singhal2質問を更新してコードを追加しました –

答えて

0

リフレッシュ機能の開始時にアレイを空にする必要があります。例:

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

サーバーから情報を取得する機能が別のビューにあることを忘れてしまいました。関数は再び呼び出されません。私は 'removeAll()'をrefresh()に追加します。 –

関連する問題