

SwiftでMBaaSであるParseを使ってTextFieldに入力した文字をTableViewに表示するプログラムを作っているのですが、TableViewを引っ張って更新する部分がうまく行きません。

[code]

    override func viewDidLoad() {
        super.viewDidLoad()
    
        //parseからデータ取得
        self.loadData()
        // DataSourceの設定をする.
        tableView.dataSource = self
    
        // Delegateを設定する.
        tableView.delegate = self
    
        //引っ張って更新
        self.pullrefresh()
    
    }
    
    //parseからデータ取得
    func loadData() {
        var query:PFQuery = PFQuery(className: "Comment")
        query.orderByDescending("createdAt")
        query.findObjectsInBackgroundWithBlock{(objects: [AnyObject]!, error: NSError!) -> Void in
            if (error != nil){
                //error処理
            }
    
            //PFObjectのcommentsにparseのデータを収納
            for object in objects {
                self.comments.addObject(object)
            }
           self.tableView.reloadData()
        }
    
    }
    
    //引っ張って更新関数
    func pullrefresh(){
        self.refreshControl = UIRefreshControl()
        self.refreshControl.attributedTitle = NSAttributedString(string: "↓引っ張る")
        self.refreshControl.addTarget(self, action: "refresh:", forControlEvents: UIControlEvents.ValueChanged)
        self.tableView.addSubview(refreshControl)
    }
    //更新のデータ取得方法
    func refresh(sender:AnyObject)
    {
        self.loadData()
        //refreshを終える
        self.refreshControl.endRefreshing()
    }
    
[/code]

こういうプログラムを書いたのですが、引っ張って更新すると、同じ内容がダブって表示されます。  
もう画面に表示されているテキストはダブらずに表示されていないものだけ更新するにはどうすればいいでしょうか？  
回答よろしくお願いします。


CC BY-SA 3.0
2015-02-26T16:37:29.967
7161
2015-07-28T03:32:36.780
8576
question
ios swift xcode parse.com
SwiftでParse.comを使用しているのですが、TableViewの更新が上手くいきません


Parseは利用したことがないのですが、気付いたことを書きます。

PFQueryで特に絞り込みがなされていないようなので、query.findObjectsInBackgroundWithBlockで毎回全件取得していますよね。それを既にデータが入っているself.commentsに追加しているので、重複して追加されているようです。

ですので可能であればPFQueryで日付で絞り込むか、それができなければself.commentsを取得した配列で置き換える

[code]

    self.comments = objects
    
[/code]

ようにすれば良いと思います。

それからquery.findObjectsInBackgroundWithBlockはバックグラウンドで処理されるようですが、コールバックはどのスレッドで呼ばれるのでしょうか？メインスレッドなど常に特定のスレッドで呼ばれるのでしたらよいのですが、もしそうでなければ同時実行障害が発生する可能性があるように思います。それとtableView.reloadDataはメインスレッドで実行する必要があります。


CC BY-SA 3.0
2015-02-27T23:08:12.967
7239
2015-02-27T23:08:12.967
238
7161
answer