如何在解析查询结束时只重新加载一次tableview?

时间:2014-11-08 02:56:51

标签: ios swift parse-platform

基本上,我构建了一个带有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()

编辑:最初发布了错误的代码。

1 个答案:

答案 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,也可以重置那里的复选标记。