我在考虑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)")
}
}
这种代码工作方式,我实现了我想要的,但是!我知道我正在重复使用单元格,我知道每次出现单元格时都会调用这段代码。
我知道这些事实:
每次滚动tableview时都会向Parse Cloud发送大量查询请求
例如,当我滚动桌面视图时,可以看到值发生变化,因为我重复使用单元格,帖子的值为我之前的单元格然后,随着新查询的刷新,这种方式有效但对用户体验不太好。
所以,我的主要疑问是,它是正确的编码方式吗?我想不是,我只想要另一种观点或想法。
感谢。
编辑1
正如我所说,我已将我的计数方法更新为countObjectsInBackgroundWithBlock
而不是findObjectsInBackgroundWithBlock
,但我无法将查询移至ViewDidLoad,因为我使用了{{ 1}}确切地检查每个帖子有多少评论。
编辑2 我已经嵌入查询来计算每个帖子的评论数量并打印结果,现在我认为我的代码比以前的版本更好,但是我无法通过结果标签,因为我收到错误:
使用未解析的标识符' commentCount'
我正在阅读有关object
按照我的更新代码:
Struct
印刷结果:
成功检索了5个分数。
发布wSCsTv8OnH有4条评论
发布LbwBfjWPod有0条评论
发布fN4ISVwqpz有0条评论
发布1rXdQr2A1F有1条评论
发布eXogPeTfNu有0条评论
答案 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)
在表格视图中显示信息之前,您应该先进行查询。