如何用两个查询填充一个 UITableView?

Posted

技术标签:

【中文标题】如何用两个查询填充一个 UITableView?【英文标题】:How can I populate one UITableView with two queries? 【发布时间】:2015-06-24 14:45:11 【问题描述】:

我有一个表格视图,需要显示用户参与的所有好友请求(发送和接收)。

但是,我能想到的唯一方法是执行两个单独的查询:一个是用户名等于请求者,另一个是用户名等于请求者。

这是最好的路线吗?如果是这样,我该如何设置代码?

我的代码在let dateString3 = timePeriodFormatter.stringFromDate(pendingDates[indexPath.row]) 上不断使应用程序在func cellForRowAtIndexPath() 上崩溃,说数组超出范围。

这是我目前所拥有的:

@IBOutlet weak var tableView: UITableView!

override func viewWillAppear(animated: Bool) 

    UIApplication.sharedApplication().beginIgnoringInteractionEvents()

    users = []
    user = PFUser()
    objectId = String()
    pendingDates = []
    username = String()
    usernames = []
    tradeIdentifier = String()
    tradeId = []
    pendingRequestsId = []

    var requestsQuery = PFQuery(className: "Requests")
    requestsQuery.whereKey("status", equalTo: "transit")
    requestsQuery.whereKey("completed", notEqualTo: PFUser.currentUser()!.username!)
    requestsQuery.whereKey("completed", notEqualTo: "complete")
    requestsQuery.whereKey("requestedUsername", equalTo: PFUser.currentUser()!.username!)
    requestsQuery.orderByDescending("createdAt")
    requestsQuery.findObjectsInBackgroundWithBlock 
        (objects: [AnyObject]?, error: NSError?) -> Void in
        if error == nil 
            if let objects = objects as? [PFObject] 
                for object in objects 
                    pendingDates.append(object.createdAt! as NSDate)
                    usernames.append(object["requesterUsername"] as! String)
                    users.append(object["requester"] as! PFUser)
                    pendingRequestsId.append(object.objectId!)
                    tradeId.append("requested")
                
            
            var requestsQuery2 = PFQuery(className: "Requests")
            requestsQuery2.whereKey("status", equalTo: "transit")
            requestsQuery2.whereKey("completed", notEqualTo: PFUser.currentUser()!.username!)
            requestsQuery2.whereKey("completed", notEqualTo: "complete")
            requestsQuery2.whereKey("requesterUsername", equalTo: PFUser.currentUser()!.username!)
            requestsQuery2.orderByDescending("createdAt")
            requestsQuery2.findObjectsInBackgroundWithBlock 
                (objects: [AnyObject]?, error: NSError?) -> Void in
                if error == nil 
                    if let objects = objects as? [PFObject] 
                        for object in objects 
                            pendingDates.append(object.createdAt! as NSDate)
                            usernames.append(object["requestedUsername"] as! String)
                            users.append(object["requested"] as! PFUser)
                            pendingRequestsId.append(object.objectId!)
                            tradeId.append("requester")

                        
                    
                    UIApplication.sharedApplication().endIgnoringInteractionEvents()
                 else 
                    UIApplication.sharedApplication().endIgnoringInteractionEvents()
                    println(error)
                
                //self.tableView.reloadData()
            
         else 
            println(error)
        
        self.tableView.reloadData()
    




func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 

    return usernames.count



func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 

    let cell: PendingTableViewCell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! PendingTableViewCell

    cell.username.text = usernames[indexPath.row] as String

    let timePeriodFormatter = NSDateFormatter()
    timePeriodFormatter.dateFormat = "EEE, MMM d"

    let dateString3 = timePeriodFormatter.stringFromDate(pendingDates[indexPath.row])

    cell.date.text = dateString3

    return cell



func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) 
    username = usernames[indexPath.row]
    objectId = pendingRequestsId[indexPath.row] as String
    tradeIdentifier = tradeId[indexPath.row]
    user = users[indexPath.row]
    self.performSegueWithIdentifier("showDetails", sender: self)        

【问题讨论】:

谢谢,但这并没有解决问题! 【参考方案1】:

我完全忘记了语法是什么,因为我使用 parse 已经有一段时间了,但我在自己构建的应用程序中具有类似的功能。 Parse 允许您分别创建两个查询,然后在调用之前将它们连接在一起,以便返回两个单独查询的结果。

由于您尝试运行的查询在同一个类中,您可以执行以下操作:

var requestQuery1 = PFQuery(className: "Requests")
requestQuery1.whereKey("status", equalTo: "Transit")
//add other query paremeter here
var requestQuery2 = PFQuery(className: "Requests)
//add query paremeters

然后你可以在这里同时运行这两个查询:

var joinQuery = PFQuery.orQueryWithSubqueries([requestQuery1, requestQuery2])

【讨论】:

这非常有用,但不幸的是,我仍然遇到同样的问题! 它在你的cellForRowAtIndexPath() 函数中的那条线上崩溃了?如果您注释掉那行代码会发生什么,应用程序的行为是否符合您的预期?您也可以将其包装在 if...let 块中,这至少可以防止它崩溃。至于解决问题,您可能需要设置一个断点并查看 pendingDates 数组中是否包含您期望的值。 是的,没错。如果我把它注释掉,一切正常(除了显示的日期是我的占位符)。 实际上,只是尝试了一个 if/else 块,并得到了修复。出于某种原因,object.createdAt 的检索时间比查询中的其余对象要长。它非常慢,导致崩溃,因为填充数组需要很长时间。 if/else 可防止崩溃,self.collectionView.reloadData() 使日期在准备好后立即显示。

以上是关于如何用两个查询填充一个 UITableView?的主要内容,如果未能解决你的问题,请参考以下文章

如何用 ASIHttpRequest JSON 数据填充 UITableView?

如何用字典中的分组结构中的数据填充UITableView?

如何用数据库数据填充 TableView

如何用一系列日期填充表格?

如何用另一个蒙版数组的值填充蒙版2D数组?

如果我有重复的日期,如何用 pandas 中两个日期之间计算的值填充一列?