添加解析对象后重新加载表视图的问题

时间:2016-01-14 15:12:42

标签: ios swift uitableview parse-platform

我有一个UITableViewController,它显示来自Parse查询的数据。它获取数据并显示正常,除非我创建新对象并再次运行查询以获取新数据。当我创建一个新对象时,表视图会将现有数据保存在我的数组中并显示它,但它会将查询中的所有数据附加到数组中,因此在创建新对象之前已存在的对象会显示两次。我尝试在查询函数的开头清空数组,但由于我在查询中设置了skip属性,所以我不能这样做,因为如果达到限制,我的数组只会在跳过后获取所有内容。那么,我怎样才能将新对象添加到我的数组中呢?

我还应该提一下,我不能简单地在addCollection()中将新对象名称添加到数组中,因为我必须将objectId添加到我的objectID数组中。

func getCollections() {
        activityIndicator?.startAnimating()

        // collections = [] - Can't do this because of the skip (if the skip is used)
        // objectID = []

        let query = PFQuery(className: "Collections")
        query.whereKey("user", equalTo: PFUser.currentUser()!)
        query.orderByAscending("collectionName")
        query.limit = limit
        query.skip = skip
        query.findObjectsInBackgroundWithBlock( {
            (objects, error) -> Void in
            if error == nil {
                if let objects = objects as [PFObject]! {
                    for object in objects {
                        let collectionName = object["collectionName"] as! String
                        let id = object.objectId
                        self.collections.append(collectionName)
                        self.objectID.append(id!)
                    }
                }

                if objects!.count == self.limit {
                    self.skip += self.limit
                    self.getCollections()
                }

                dispatch_async(dispatch_get_main_queue()) {
                    self.tableView.reloadData()
                    self.activityIndicator!.stopAnimating()
                }
            } else {
                var errorString = String()
                if let message = error!.userInfo["error"] {
                    errorString = message as! String
                }

                print(errorString)
            }
        })
    }

func addCollection(name: String) {
        let collection = PFObject(className: "Collections")
        collection["user"] = PFUser.currentUser()
        collection["collectionName"] = name
        collection.saveInBackground()
        getCollections()
    }

1 个答案:

答案 0 :(得分:2)

此代码在逻辑上存在缺陷,可以简化:

func addCollection(name: String) {
    let collection = PFObject(className: "Collections")
    collection["user"] = PFUser.currentUser()
    collection["collectionName"] = name
    collection.saveInBackground()
    getCollections()
}

问题包括:

  1. 您的保存在后台运行,在您尝试重新加载之前未完成
  2. 您的重新加载不会更新或重置跳过和限制值
  3. 除非您需要检查其他用户的更新,否则您不应向服务器发出新请求以获取新的详细信息。相反,您应该在save和其中添加完成块:

    1. 获取名称和ID,并将这些值添加到数据源数组
    2. 通过添加一个
    3. 来更新跳过值