[英]Parse via Swift with Complex Queries
我在解析中創建復雜的查詢時遇到了一些困難。 我要實現的是搜索_Users類,而不返回自身,如果Invites類中已經存在邀請,則顯示待處理文本而不是添加按鈕,並且如果我和用戶都已接受邀請,則不顯示他們。
我已經取得了一些成就,但是我不確定我是否以最有效的方式做到這一點。 例如,我首先查詢_User類並找到與搜索詞匹配的任何用戶,然后循環瀏覽,如果objectId == currentUser()。objectId,則跳過該記錄。 然后,我在每個記錄的循環中運行另一個查詢,以查看是否有任何待處理的邀請,如果有,我將Pending設置為true,但是我沒有在后台進行該搜索,因為我第一次遇到問題查詢塊在第二秒之前完成,而我的標志未首先設置。 那么,我將進行第三次查詢以查看該字段是否被接受嗎? 還是有辦法使這一切成為一個大查詢? 我的代碼如下搜索:
func performSearchForText(文本:字符串,完成:SearchComplete){狀態= .Loading
// 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)進一步優化其他查詢。
另外,您可以在開始時執行類似的操作,因此您不必在查詢完成塊中檢查currentUser:
containsDisplayName.whereKey("objectId", notEqualTo: PFUser.currentUser()!.objectId!)
但是,如果其中沒有存儲許多其他信息,則您絕對不需要邀請表。 如果您必須將其保留為單獨的表,則使用指針(1到1)或PFRelation(1到很多)將為您節省內部查詢的麻煩。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.