Swift - tableView.reloadData() 不工作,即使它似乎在正确的线程中

Swift - tableView.reloadData() not working even though it seems in the right thread

我正在开发一款社交媒体应用程序,我在其中实现了 like/unlike/follow/unfollow 基本功能。我正在使用 Parse 作为后端。事情是这样的。

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

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 中,我根据该单元格的 post 的 id 是否包含在喜欢的 post 数组中来设置 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() 永远不会有效。

有什么想法大大appreciated.Thank你!

好像不在主线程中。 println 在任何线程中都运行良好,但是当您更新 UI 时,您应该在主线程中执行此操作。尝试将您的代码包装在这样的块中:

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

好的,这个问题实际上很愚蠢,但我发帖是为了防止像我这样的菜鸟遇到这个问题:基本上我是在调用 reloadData 而不更新任何东西,因为喜欢的帖子数组在 getLikes( ).我把 self.getLikes() 而不是 reloadData() 并且它工作正常。