我正在开发一个社交媒体应用,我已经实现了基本的/不同/关注/取消关注功能。我使用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()永远不会工作。
非常感谢任何想法。谢谢!
答案 0 :(得分:1)
似乎不在主线程中。 println
适用于任何线程,但是当您更新UI时,您应该在主线程上执行此操作。尝试将代码包装在这样的块中:
NSOperationQueue.mainQueue.addOperationWithBlock {
self.homeTableView.reloadData()
}
答案 1 :(得分:0)
好吧问题实际上是愚蠢的,但我发布以防任何像我这样的菜鸟都会遇到问题:基本上我在没有更新任何内容的情况下调用reloadData,因为喜欢帖子的数组在getLikes中刷新( )。我把self.getLikes()而不是reloadData()放在一起工作正常。