如何在PFQueryTableViewController类

时间:2015-05-17 02:34:05

标签: ios swift parse-platform pfquery pfquerytableviewcontrolle

我有一个扩展PFQueryTableViewController的课程。在本课程的implementation of queryForTable()中,我尝试使用findObjectsInBackgroundWithBlock添加一些数据来构建查询。问题是,由于findObjectsInBackgroundWithBlock是异步的,我如何使用我从findObjectsInBackgroundWithBlock获得的数据并使用它在下面构建query并执行return query

我的代码和错误如下所示。

override func queryForTable() -> PFQuery {
    let query = PFUser.query()
    //let query = PFQuery(className: "Room")

    query?.whereKey("objectId", notEqualTo: PFUser.currentUser()!.objectId!)

    //Showing OnlineUsers only
    let onlineUsersQuery = PFQuery(className: "OnlineUsers")
    onlineUsersQuery.whereKey("user", equalTo: PFUser.currentUser()!)
    onlineUsersQuery.findObjectsInBackgroundWithBlock({ (results:[AnyObject]?, error:NSError?) -> Void in

        let usersOnlineNow = results as! [PFObject]
        for user in usersOnlineNow {

            self.mLog.printToLog("Select only users who are in the OnLineUsers column")
            query?.whereKey("objectId", equalTo: PFUser.currentUser()!.objectId!)
            //query?.whereKey("objectId", equalTo: "noone")

            if self.searchInProgress {
                query!.whereKey("username", containsString: self.searchString)
            }

            if self.objects!.count == 0 {
                //https://groups.google.com/forum/#!topic/parse-developers/7O9YCHNbuEo
                query!.cachePolicy = PFCachePolicy.CacheThenNetwork //kPFCachePolicyCacheThenNetwork
                //query.cachePolicy = kPFCachePolicyCacheThenNetwork
            }

            query!.orderByAscending("username")

            return query!

        }

    })

//        query!.orderByAscending("username")
//        
//        return query!
}

Picture showing function and error

3 个答案:

答案 0 :(得分:0)

不要那样做。如果您需要该信息以填充表格然后获取它,然后创建/重新加载表格,因此您可以创建适当的查询。

您最初可以将用户放在不同的屏幕上,以便您不必乱用加载/卸载表格视图或尝试提供占位符查询。

答案 1 :(得分:0)

我会在完成colsure上创建查询并调用查询"就在那里"。

如果它太复杂,那么设置PFQuery的实例变量并在完成闭包中更新它。将属性观察者添加到查询属性并在didSet {}

中调用所需的内容
    var query = PFUser.Query()

    var finalquery:PFQuery{
    didSet{
        //call some function here
        //executeQuery(query)
    }
}

另外,在函数外部定义查询变量,闭包很容易捕获变量。

从当前queryForTable()函数的完成闭包中设置值时解析后台调用。

onlineUsersQuery.findObjectsInBackgroundWithBlock({ (results:[AnyObject]?, error:NSError?) -> Void in

    let usersOnlineNow = results as! [PFObject]
    for user in usersOnlineNow {

        self.mLog.printToLog("Select only users who are in the OnLineUsers column")
        query?.whereKey("objectId", equalTo: PFUser.currentUser()!.objectId!)
        //query?.whereKey("objectId", equalTo: "noone")

        if self.searchInProgress {
            query!.whereKey("username", containsString: self.searchString)
        }

        if self.objects!.count == 0 {
            //https://groups.google.com/forum/#!topic/parse-developers/7O9YCHNbuEo
            query!.cachePolicy = PFCachePolicy.CacheThenNetwork //kPFCachePolicyCacheThenNetwork
            //query.cachePolicy = kPFCachePolicyCacheThenNetwork
        }

        query!.orderByAscending("username")

        self.finalquery = query

    }

})

如果我理解错了,请告诉我,我会尽力澄清。欢呼声。

答案 2 :(得分:0)

我遇到了同样的问题。当视图加载时,调用queryForTable,理想情况下需要在没有延迟的情况下返回pftable的查询。我的查询需要其他几个查询来手动构建条件。所以我选择调度构建真实查询的后台线程,并立即返回一个选择正确的解析类但没有行的pfquery。

这导致queryForTable成功完成,并且表接口立即呈现,没有关于在主线程上运行的慢速pfqueries的警告。然后,当我的后台查询完成时,我更新保存的pfquery变量,并调用重载表数据。

逻辑是:

  • 在视图加载时,将queryIsReady的布尔标志设置为false,并返回一个返回没有行的类的pfquery值

  • 在queryForTable中
  • ,如果queryIsReady == false,则调度后台线程以创建真实的pfquery,并返回不产生任何行的默认pfquery。

  • 后台线程完成后,将pfquery变量设置为所需的新值,并设置queryIsReady = true

  • 调用重装表数据,这将重新调用queryForTable

如果任何其他操作导致queryForTable在后台线程完成之前运行,则布尔queryIsReady将为false,并且将使用空结果集。