繁体   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