在cellForRowAtIndexPath

时间:2015-12-08 14:19:51

标签: ios swift uitableview parse-platform pfquery

我在考虑PFQuery

我正在开发一个向用户显示Feed的应用程序,它还会为每个帖子显示一个Like计数器(如Facebook App或Instagram App)。

所以在我的PFQueryTableViewController我有我的主要查询,它基本上显示了所有的帖子:

override func queryForTable() -> PFQuery {
    let query = PFQuery(className: "Noticias")
    query.orderByDescending("createdAt")   
    return query
}

我使用另一个查询来计算Parse中另一个类的Likes数量,这些Likes包含所有喜欢。

override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath, object: PFObject?) -> PFTableViewCell? {
    var cell = tableView.dequeueReusableCellWithIdentifier("FeedCellIdentifier") as! FeedCell!
    if cell == nil {
        cell = FeedCell(style: UITableViewCellStyle.Default, reuseIdentifier: "FeedCellIdentifier")
    }

    let query2 = PFQuery(className:"commentsTable")
    query2.whereKey("newsColumn", equalTo: object!)
    query2.findObjectsInBackgroundWithBlock {
        (objectus: [PFObject]?, error: NSError?) -> Void in

        if error == nil {

            let quantidade = objectus!.count

            let commentQuantidade = String(quantidade)

            cell.comentariosLabel.text = commentQuantidade
        } else {
            // Log details of the failure
            print("Error: \(error!) \(error!.userInfo)")
        }
    }

这种代码工作方式,我实现了我想要的,但是!我知道我正在重复使用单元格,我知道每次出现单元格时都会调用这段代码。

我知道这些事实:

  1. 每次滚动tableview时都会向Parse Cloud发送大量查询请求

  2. 例如,当我滚动桌面视图时,可以看到值发生变化,因为我重复使用单元格,帖子的值为我之前的单元格然后,随着新查询的刷新,这种方式有效但对用户体验不太好。

  3. 所以,我的主要疑问是,它是正确的编码方式吗?我想不是,我只想要另一种观点或想法。

    感谢。

    编辑1

    正如我所说,我已将我的计数方法更新为countObjectsInBackgroundWithBlock而不是findObjectsInBackgroundWithBlock,但我无法将查询移至ViewDidLoad,因为我使用了{{ 1}}确切地检查每个帖子有多少评论。

    编辑2 我已经嵌入查询来计算每个帖子的评论数量并打印结果,现在我认为我的代码比以前的版本更好,但是我无法通过结果标签,因为我收到错误:

      

    使用未解析的标识符' commentCount'

    我正在阅读有关object

    的一些文档

    按照我的更新代码:

    Struct

    印刷结果:

      

    成功检索了5个分数。

         

    发布wSCsTv8OnH有4条评论

         

    发布LbwBfjWPod有0条评论

         

    发布fN4ISVwqpz有0条评论

         

    发布1rXdQr2A1F有1条评论

         

    发布eXogPeTfNu有0条评论

2 个答案:

答案 0 :(得分:3)

更好的做法是查询视图加载的所有数据,将其保存到模型中,然后在表视图滚动中从中读取数据。处理查询时,您可以显示下载指标或占位符数据。查询完成后,您将调用tableView.reloadData()

您可以通过创建如下的新变量来实现此目的:

 var cellModels : [PFObject] = []

query2.findObjectsInBackgroundWithBlock

 for object in objectus{
   self.cellModels.append(object)
 }
 self.tableView.reloadData()

cellForRowAtIndexPath

let model = cellModels[indexPath.row]
// configure cell according to model
// something like cell.textLabel.text = model.text

P.S 如果您只需要获取对象数,则应该查看方法countObjectsInBackgroundWithBlock。因为如果有很多例如评论findObjectsInBackgroundWithBlock将返回最多1000个对象,但仍然不能下载整个对象,只有一个数字这将加速查询和备用用户'细胞计划。

更新:此外,如果您需要存储评论数量,您可以像这样创建简单的struct

struct PostObject{
 let post : PFObject
 let commentCount : Int
}

var posts : [PostObject] = []

当您查询帖子时,您会遍历收到的对象并填充posts数组。

for object in objects{
  // create countObjectsInBackgroundWithBlock query to get comments count for object
  // and in result block create
  let post = PostObject(object, commentCount:commentCount)
  posts.append(post)

} 
tableView.reloadData()

cellForRowAtIndexPath

let post = posts[indexPath.row]
cell.postCountLabel.text = String(post.commentCount)
// configure cell accordingly

答案 1 :(得分:0)

在表格视图中显示信息之前,您应该先进行查询。