2016-12-18 5 views
1

CloudKitの静的データ(3値)があります。UITableViewをリフレッシュすると、3つの値の代わりに6つの値が得られますテーブルリフレッシュでは配列アイテムの数が2倍になります

Arrayから古いデータをリフレッシュせずに廃棄する理由はわかりませんが、古いデータはそのまま残して、同じデータをArrayに追加します。

func getData() { 
    cloud.getCloudKit { (game: [Game]) in 
     var teamColorArray = [String]() 
     for item in game { 
      let itemColor = item.teamColor 
      teamColorArray.append(itemColor) 
      print("TCA in: \(teamColorArray)") 
     } 

     self.teamColorArray = teamColorArray 
     self.tableView.reloadData() 
    } 
} 

プリント:[ "CC0033"、 "FDB927"、 "E3263A"]

更新データUIRefreshControlを引っ張ったとき:

@IBAction func refreshData(_ sender: Any) { 
    self.teamColorArray.removeAll() 
    getData() 
    self.refreshControl?.endRefreshing() 
} 
をを設定

初期UITableView

プリント:["CC0033"、 "FDB927"、 "E3263A"、 "CC0033"、 "FDB927"、 "E3263A "]

私はそれをどういうわけかに絞り込んだと思いますgetData()は6つの項目の数に増分されますgameです。私はCloudKitからすべての新しいデータを引っ張っていたのですが、それがなぜ3つの項目にとどまっているのかわかりませんが、完成ハンドラを呼び出すと値が倍増し、おそらく私の中にremoveAllが必要でしょうか?私はちょうど本当にわからない

私は間違っていると誰かが何かを持っているか、彼らは自分のコードを修正するために何をしたいですか?

ありがとうございます!

+0

アレイがユニークであることを期待したい場合は、配列の代わりにセットを使用してください。そうすれば、重複したデータを取得することはありません。投稿(http://stackoverflow.com/questions/27624331/unique-values-of-array-in-swift)を参照してください。 –

+0

@ErionVええと、私は実際にセットを試してみるかもしれないと思っていましたが、私がこれまでに持っていたものでもっとシンプルなものを混乱させるかどうかは分かりませんでした。セットを試す可能性を再確認してくれてありがとうtho! – SRMR

答えて

1

クラッシュキットへの非同期呼び出しに関係する場合があります。私はあまりにもリフレッシュコントロールに精通していないが、ここであなたの問題を解決し、あなたのコードを少しきれいにする方法です。

func getData(_ completion:() ->()) { 
    teamColorArray.removeAll() 
    cloud.getCloudKit { [weak self] (game: [Game]) in 
    guard let unwrappedSelf = self else { return } 
    var updatedColorArray = [String]() 
    game.forEach { updatedColorArray.append($0.teamColor) } 
    unwrappedSelf.teamColorArray = updatedColorArray 
    completion() 
} 
} 

今あなたがたgetDataを呼び出すとき、それはあなたが

  • から必ずあなたの更新のUIを作る保持サイクルの可能性を排除するために、弱い自己を追加し、この

    getData { 
        DispatchQueue.main.async { [weak self] in 
        self?.tableView.reloadData() 
        self?.refreshControl?.endRefreshing() 
        } 
    } 
    
    • ようになります。メインスレッド

    • 呼び出し時にreloadDataとendRefreshing yo Uは、配列が正しく、あなたが毎回それを呼び出す必要がありますように思えるので、私はのgetData関数内teamColorArray.removeAllを()入れ

    を設定されている知っている、それが機能毎回の前にそれを追加する必要がなくなります。

  • +0

    がうまく見える、OPの応答を待つことができます。 –

    +0

    @ Mr.Bistaありがとう! – JustinM

    +0

    私は実装しようとし、あなたにお知らせします、ありがとう! – SRMR

    関連する問題