我在 Parse 中创建复杂查询时遇到一些困难。我想要实现的是搜索 _Users 类,而不返回自己作为结果,如果 Invite 类中已存在 Invite,则显示待处理文本而不是添加按钮,如果我自己和用户都已接受邀请,则不显示他们根本。
我已经取得了一些成就,但我不确定我是否以最有效的方式做到这一点。例如,我首先查询 _User 类并找到与搜索词匹配的任何用户,然后循环遍历,如果 objectId == currentUser().objectId,则跳过该记录。然后我在该循环中对每条记录运行另一个查询,以查看是否有任何待处理的邀请,如果有,我将待处理的标志设置为 true,但是我不在后台进行该搜索,因为我对第一个邀请有问题查询 block 在第二个之前完成,并且我的标志没有首先设置。那么我会进行第三次查询来查看该字段是否被接受吗?或者有没有办法让这一切成为一个大查询?我的搜索代码如下:
func PerformSearchForText(text: String, 完成: SearchComplete) { 状态=.加载中
// Query Parse
var containsDisplayName = PFQuery(className:"_User")
containsDisplayName.whereKey("displayName", containsString: text)
var containsUsername = PFQuery(className: "_User")
containsUsername.whereKey("username", containsString: text)
var query = PFQuery.orQueryWithSubqueries([containsUsername, containsDisplayName])
query.findObjectsInBackgroundWithBlock {
(results: [AnyObject]?, error: NSError?) -> Void in
//self.state = .NotSearchedYet
var success = false
if error == nil {
// Found results
// Set Result state to either Results or NoResults
if let results = results {
//println(results)
if results.count == 0 {
self.state = .NoResults
} else {
// Read Results into UserSearchResult Array
// Dont show self in results
// If user has already accepted a request, dont show
// If they have already invited, show Pending instead of button
var userSearchResults = [UserSearchResult]()
var searchResult = UserSearchResult()
for result in results {
if result.objectId != PFUser.currentUser()?.objectId {
// Query invites table to see if they already are accepted with user
// or if a pending invite exists
// Set invite or accepted respectively
var invitedQuery = PFQuery(className: "Invites")
invitedQuery.whereKey("pending", equalTo: true)
invitedQuery.whereKey("inviteToUser", equalTo: result.objectId!!)
var invitedQueryResults = invitedQuery.findObjects()
if invitedQueryResults?.count > 0 {
self.pendingInvite = true
}
searchResult.displayName = result["displayName"] as! String
searchResult.emailAddress = result["username"] as! String
searchResult.inviteUserID = result.objectId!!
searchResult.invited = self.pendingInvite
searchResult.accepted = false
userSearchResults.append(searchResult)
}
}
if userSearchResults.count > 0 {
self.state = .Results(userSearchResults)
} else {
self.state = .NoResults
}
}
success = true
}
dispatch_async(dispatch_get_main_queue()) {
UIApplication.sharedApplication().networkActivityIndicatorVisible = false
completion(success)
}
} else {
// Error, print it
println(error)
}
}
}
最佳答案
除非您的邀请表中有更多内容,否则我建议将其删除并在您的用户表中添加一个“invitePending”字段。
然后您可以使用 wherekey("invitePending", equalTo: true) 进一步优化其他查询。
此外,您可以在开始时执行类似的操作,这样您就不必在查询完成 block 中检查 currentUser:
containsDisplayName.whereKey("objectId", notEqualTo: PFUser.currentUser()!.objectId!)
但是,如果邀请表没有存储大量其他信息,那么您绝对不需要它。如果您必须将其保留为单独的表,那么使用指针(用于 1 到 1)或 PFRelation(用于 1 到多)将为您省去内部查询的麻烦。
关于ios - 通过 Swift 解析复杂查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31707898/