基本上,我构建了一个带有tableviewcontroller
的{{1}}来为每个单独的单元格加载信息并将其存储在一个数组中。有两个解析调用,一个用于将用户名存储到一个数组中,另一个用于检查当前用户是否“跟踪”它们。
PFQuery
如果我在其他地方拨打var query = PFUser.query()
query.findObjectsInBackgroundWithBlock {
(objects: [AnyObject]!, error: NSError!) -> Void in
self.users.removeAll(keepCapacity: true) // users is an array declared globally
for object in objects {
var user:PFUser = object as PFUser
var isFollowing:Bool
if user.username != PFUser.currentUser().username {
self.users.append(user.username)
isFollowing = false
var query = PFQuery(className:"followers")
query.whereKey("follower", equalTo:PFUser.currentUser().username)
query.whereKey("following", equalTo:user.username)
query.findObjectsInBackgroundWithBlock {
(objects: [AnyObject]!, error: NSError!) -> Void in
if error == nil {
for object in objects {
isFollowing = true
}
self.following.append(isFollowing)
self.tableView.reloadData()
} else {
// Log details of the failure
println(error)
}
}
}
}
}
,表格将无法正常显示。这使我的表加载效率低下。因为表重新加载每次检查“isfollowing”变量。我怎么才能重新加载一次呢?在所有“isfollowing”变量被追加之后?您能否逐步概述解决方案,以便我能够获得一般的方向感和学习内容。
EDIT2:
在上面的代码中,我查询以检查currentUser正在关注哪些用户。如果他们跟随他们,我将“true”追加到数组“follow”。下面的代码是我正在检查tableviewcells以显示他们正在关注其他用户。使用我的原始代码,所有单元格在向上和向下滚动几次后都会被勾选,为什么?
reloadData()
编辑:最初发布了错误的代码。
答案 0 :(得分:2)
使用findObjects
同步调用并将其放入我们自己的队列可能有帮助。
// queue is declared as an instance property
let queue = dispatch_queue_create(nil, DISPATCH_QUEUE_SERIAL)
var query = PFUser.query()
dispatch_async(queue) {
dispatch_async(dispatch_get_main_queue()) {
self.users.removeAll(keepCapacity: true) // users is an array declared globally
}
for user in query.findObjects() as [PFUser] {
var isFollowing = false
if user.username != PFUser.currentUser().username {
dispatch_async(dispatch_get_main_queue()) {
self.users.append(user.username)
}
var query = PFQuery(className:"followers")
query.whereKey("follower", equalTo:PFUser.currentUser().username)
query.whereKey("following", equalTo:user.username)
// call findObjects synchronously
if let objects = query.findObjects() {
if !objects.isEmpty {
isFollowing = true
}
dispatch_async(dispatch_get_main_queue()) {
self.following.append(isFollowing)
}
}
}
}
// notify table view to reload
dispatch_async(dispatch_get_main_queue()) {
self.tableView.reloadData()
}
}
您可以创建UITableViewCell子类并覆盖其prepareForReuse
以重置accessoryType
。
class MyTableView: UITableViewCell {
override func prepareForReuse() {
accessoryType = .None
}
}
在您的代码中,您没有处理following[indexPath.row] != true
的情况。如果您不想继承UITableViewCell,也可以重置那里的复选标记。