Arrays 从解析中的指针数组中检索对象,然后在Swift中更新uitableview的更有效方法

Arrays 从解析中的指针数组中检索对象,然后在Swift中更新uitableview的更有效方法,arrays,swift,uitableview,pointers,parse-platform,Arrays,Swift,Uitableview,Pointers,Parse Platform,我已经向viewController传递了一个解析“事件”对象。不需要查询它 此“事件”对象包含一个指针数组,用于解析“注释”对象 我对“Comment”对象的两个属性感兴趣。这两个字符串都称为“commentAuthor”和“commentText” 我有一个UITableView,它有原型单元格,需要显示“commentAuthor”和“commentText”字符串 它目前正在运行,但我对我的工作方式不满意,这就是: var commentsArrayOfPointers: [AnyObj

我已经向viewController传递了一个解析“事件”对象。不需要查询它

此“事件”对象包含一个指针数组,用于解析“注释”对象

我对“Comment”对象的两个属性感兴趣。这两个字符串都称为“commentAuthor”和“commentText”

我有一个UITableView,它有原型单元格,需要显示“commentAuthor”和“commentText”字符串

它目前正在运行,但我对我的工作方式不满意,这就是:

var commentsArrayOfPointers: [AnyObject]?
var commentsArrayOfObjects = [PFObject]()

func dealWithCommentPointers() {

    //get array of pointers from "Event" object
    commentsArrayOfPointers = theEvent!["commentsArray"] as? [AnyObject]

    commentsArrayOfObjects.removeAll()

    //loop through each pointer, and "Fetch" its associated "Comment" object,
    //then append that "Comment" object to my array of "Comment" objects
    for comment in commentsArrayOfPointers! {

        comment.fetchIfNeeded()

        commentsArrayOfObjects.append(comment as! PFObject)

    }

    //print(commentsArrayOfObjects)

    self.tableView.reloadData()

}
然后,我像这样构建表格单元格,从之前填写的“commentsArrayOfObjects”中提取数据:

它可以工作,但我对在每个注释对象上使用解析命令“fetchIfNeeded()”并不感到兴奋,因为它是一个同步函数,这意味着它会导致我的应用程序在显示表之前暂停。我更喜欢使用异步函数,这将允许加载视图控制器的其余部分,然后在注释可用时填充表

我尝试执行了一个
fetchInBackgroundIfNeeded()
,这是一个异步命令,但在构建原型单元之前,它当然没有完成,导致崩溃(因为它要查找的数据数组为零)

我还尝试在我需要的“Event”上设置一个PFQuery(Event,尽管我已经有了该事件,但不需要重新查询),并在“Event”类的“commentsArray”属性上添加一个“includeKey”。然后在查询结束时,我做了一个
self.tableView.reloadData()
,但这也不起作用。这里似乎有一个更大的问题,因为查询似乎从未执行过,表也会重新加载,尽管我已经注释掉了执行此操作的代码。以下是这一尝试(我认为这更接近于我问题的正确解决方案):


那么,有什么想法吗?

您应该真正使用注释的关系而不是数组,然后您可以异步运行一个查询来获取注释。此外,还需要更改表视图设置,以便在没有任何注释时不会崩溃。您没有说明它崩溃的原因,因此我无法对此提供帮助,但在查询进行期间,您确实应该有一个活动指示器,然后将其替换为实际单元格或一个指示尚未有注释的单元格


从技术上讲,使用异步获取应该也适用于少量注释,但是当您添加更多注释时,您会发出更多的网络请求,并且很快就会淹没网络,它们都会失败。

为什么不事先将所有
注释
对象包含在数组中?我猜想您已经在上一个视图控制器上执行了一个查询,这就是传递
事件
对象的方式。执行该查询时,在数组上使用
includeKey
,以便所有
注释
对象与查询同时返回


如果不能做到这一点,我建议在表视图中添加一个耦合函数,以便从解析中异步获取数据,然后重新加载表。在这个例子中,有一个UISearchController,但是想法是一样的。

谢谢Russell。我想事先传入
注释
对象。这似乎是最简单的解决方案,但我访问当前viewController的方法之一是“创建事件”视图控制器,在该方法中,我将“事件”对象设置为在先前(或“创建事件”)viewController的prepareForSegue方法中传递到当前viewController。当来自这个VC的时候,总是没有“Comment”对象,但是看起来我必须做一个查询,以便包含
commentsArray
。我想再做一次查询也不会让我丧命,但看起来很浪费?所以,我想了想你说的关于在我的表视图中添加几个函数的话。我很想这么做,但我不知道怎么做。我仔细研究了你的相关问题,但我真的不明白它如何适用于我正在做的事情。我在tableView代码中看到了一些
if
语句,但没有其他函数。我可能遗漏了什么…我不明白如果事件刚刚创建,为什么需要添加另一个查询。在这种情况下,不是只有0条注释并且表视图是空的吗?我链接的示例提供了一种替代使用
PFQueryTableViewController
的方法。通过使用您自己的表视图控制器并实现您自己的访问解析的功能,您有了更大的灵活性。if语句仅适用于搜索控制器,您可以忽略案例中的那些语句。您只需要数组容器和解析方法。谢谢Russell。我没有使用
PFQueryTableViewController
。我确实在使用我自己的tableViewController。我在上一个视图控制器中创建事件,并将注释数组存储在该事件中。然而,Parse将它们存储为“指针”。因此,我不知道如何通过事件对象将实际对象传递给下一个视图控制器,而不使用
includeKey
进行解析查询。对于您的问题,是的,当您创建一个事件时,将没有任何注释,并且tableView将是空的。但我想我必须传入这个对象数组,即使它是空的……很乐意帮忙。由于您正在传递
事件
,我猜您在表视图中为它定义了一个
PFObject
,该对象在上一个视图控制器上的
prepareForSegue
期间设置。同样,您可以在表视图中为在
prepareForSegue
期间设置的注释定义一个
[PFObject]
数组。谢谢。如果我不能得到我目前的工作方法,我将放弃并重新考虑使用rel
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {

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

    cell.commentCellNameLabel.text = commentsArrayOfObjects[indexPath.row]["commentAuthor"] as! String
    cell.commentCellCommentLabel.text = commentsArrayOfObjects[indexPath.row]["commentText"] as! String

    return cell
}
func dealWithCommentPointers() {

    print("inside the function")

    var query = PFQuery(className: "Event")
    let objectIdToLookup = self.theEvent?.objectId
    query.whereKey("objectId", equalTo: objectIdToLookup!)
    query.includeKey("commentsArray")

    query.findObjectsInBackgroundWithBlock { (results, error) -> Void in

        if error != nil {
            print("Error found")
            print(error)
        }


        else {

            let eventArray = results as! [PFObject]

            let theEventToDisplayCommentsFor = eventArray[0] //this should always be [0]

            print("yo dude")

            self.commentsArrayOfObjects = theEventToDisplayCommentsFor["commentArray"] as! [PFObject]

            print("hey here i am!")

            print(self.commentsArrayOfObjects.count)

            self.tableView.reloadData() //even tried commenting this out, it is still called?!

        }

    }

}