Swift - tableView.reloadData()即使在正确的线程中

时间:2015-06-29 10:00:12

标签: swift uitableview parse-platform reloaddata

我正在开发一个社交媒体应用,我已经实现了基本的/不同/关注/取消关注功能。我使用Parse作为后端。这是发生的事情。

我在我的ViewDidLoad中使用此功能从后端获取用户喜欢的帖子,这似乎有效:

func getLikes() {

    var query = PFQuery(className: "Likes")
    query.whereKey("Liker", equalTo: PFUser.currentUser()["displayName"])
    query.findObjectsInBackgroundWithBlock { (results:[AnyObject]!, error:NSError!) -> Void in
        if error == nil {

            for result in results {

                self.likedPosts.append(result["likedItem"] as String)

            }
            println(self.likedPosts)

            self.homeTableView.reloadData()

        }
    }



}

然后,在我的cellForRowAtIndexPath中,我根据该单元格的帖子的id是否包含在喜欢的帖子数组中来设置likeButton的标题和功能:

if contains(self.likedPosts, self.id[indexPath.row]) {
                cell.thankButton.setTitle("Unlike", forState: UIControlState.Normal)
                cell.thankButton.addTarget(self, action: "unlike:", forControlEvents: UIControlEvents.TouchUpInside)
            }

            else {
                cell.thankButton.setTitle("Like", forState: UIControlState.Normal)
                cell.thankButton.addTarget(self, action: "like:", forControlEvents: UIControlEvents.TouchUpInside)

        }

这很好用,因为每个单元格中的按钮根据后端显示正确的标题。它们也有正确的功能,代码如下:

func like(sender:UIButton) {


    var id = sender.tag
    var postId = self.id[id]
    var likeAction = PFObject(className: "Likes")
    likeAction["Liker"] = PFUser.currentUser()["displayName"]
    likeAction["likedItem"] = postId
    likeAction.saveInBackgroundWithBlock { (success:Bool!, error:NSError!) -> Void in
        if error == nil {
            if success == true {

            self.homeTableView.reloadData()
            println("liked")                    
            }
        }

    }

}

func unlike(sender:UIButton) {

    var id = sender.tag
    var postId = self.id[id]
    var query = PFQuery(className: "Likes")
    query.whereKey("Liker", equalTo: PFUser.currentUser()["displayName"])
    query.whereKey("likedItem", equalTo: postId)
    var targetId:String!
    query.findObjectsInBackgroundWithBlock { (results:[AnyObject]!, error:NSError!) -> Void in
        if error == nil {

            targetId = results[0].objectId
            var likeObject = PFObject(withoutDataWithClassName: "Likes", objectId: targetId)
            likeObject.deleteInBackgroundWithBlock({ (success:Bool!, error:NSError!) -> Void in
                if error == nil {

                    if success == true {

                    self.homeTableView.reloadData()
                    println("liked")


                    }
                }

            })

        }
    }

}

然而,reloadData永远不会工作,并且按钮保留其标题和功能,即使它应该更改(因为后端注册更改)。我知道reloadData()不能工作的一个反复出现的原因是它不在正确的线程中,但据我所知,它就在这里。 " println()"在这两个函数实际上每次都有效,后端每次都会注册更改,但reloadData()永远不会工作。

非常感谢任何想法。谢谢!

2 个答案:

答案 0 :(得分:1)

似乎不在主线程中。 println适用于任何线程,但是当您更新UI时,您应该在主线程上执行此操作。尝试将代码包装在这样的块中:

NSOperationQueue.mainQueue.addOperationWithBlock {
    self.homeTableView.reloadData()
}

答案 1 :(得分:0)

好吧问题实际上是愚蠢的,但我发布以防任何像我这样的菜鸟都会遇到问题:基本上我在没有更新任何内容的情况下调用reloadData,因为喜欢帖子的数组在getLikes中刷新( )。我把self.getLikes()而不是reloadData()放在一起工作正常。