0

我有一个扩展PFQueryTableViewController的类。在此类的 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!
}

图片显示功能和错误

4

3 回答 3

0

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

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

于 2015-05-17T10:50:36.543 回答
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

    }

})

让我知道如果我理解错了,我会尽力澄清。干杯。

于 2015-05-17T11:55:34.057 回答
0

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

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

逻辑是:

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

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

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

  • 调用 reload table 数据,这将重新调用 queryForTable

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

于 2017-04-13T01:40:43.443 回答