簡體   English   中英

通過Swift使用復雜查詢進行解析

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM