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() 并且它工作正常。
我正在开发一款社交媒体应用程序,我在其中实现了 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() 并且它工作正常。