ios - 通过 Swift 解析复杂查询

标签 ios swift parse-platform

我在 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/

相关文章:

ios - Swift - 解决测试驱动开发中的构建错误?

ios - swift ios 将日期选择器添加到 swift 中的警报中,以使用核心数据保存到本地数据库

xcode - Swift 2 + 解析 : Unexpectedly found nil while unwrapping an Optional value

ios - 无法正确执行方法调用

javascript - Parse..com 云代码 : Trying to update user's column but nothing happens

ios - 在 CoreML VNCoreMLRequest 之前触发时 ActivityIndi​​cator 不显示

ios - asyncAfter 不延迟指定时间的第一次执行

ios - 如何在GMSMapView中获取动画折线路线,使其在 map 移动时随 map 一起移动?

json - 如何在 Swift 中解码 HTML 实体?

swift - SKSpriteNode 具有物理主体自动校正方向