我有一个扩展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!
}
答案 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值
,如果queryIsReady == false,则调度后台线程以创建真实的pfquery,并返回不产生任何行的默认pfquery。
后台线程完成后,将pfquery变量设置为所需的新值,并设置queryIsReady = true
调用重装表数据,这将重新调用queryForTable
如果任何其他操作导致queryForTable在后台线程完成之前运行,则布尔queryIsReady将为false,并且将使用空结果集。