ios - 无法填充到 UITableView Swift

标签 ios iphone swift uitableview

我试着看看我是否遗漏了一些代码,但也许我没有看到错误

其他一切都已正确连接和设置。但是我不明白为什么我不能填充 UITableView

但我不确定为什么它不传递数据。想法?

func getLocalComments(point:PFGeoPoint){
    var temp = [CommentDetails]()
    DispatchQueue.global(qos: .background).async {
        let qComments = PFQuery(className: "UserCommentary")
        let qDrinks = PFQuery(className: "venueDrinks")
        if self.type == "House Parties"{
            //Query the bars
            qDrinks.whereKey("venueName", equalTo: self.id)
            qDrinks.whereKey("venueID", equalTo: self.venueName)
            qDrinks.addDescendingOrder("createdAt")

            qComments.whereKey("venueID", equalTo: self.id)
            qComments.whereKey("venueName", equalTo: self.venueName)

            do{
                var comment:CommentDetails = CommentDetails.init(comm: "Test", ven: self.venueName, venId: self.id, owner: PFUser.current()!.username!, vote: 0)
                let qReply1 = try qDrinks.findObjects()
                if qReply1.count>0{
                    var i = 0
                    while i < 2 {
                        let item = qReply1[i]
                        print(item)
                        comment.cellType = 2
                        i+=1
                    }
                    //temp.append(comment)
                }
                comment = CommentDetails.init(comm: "Test", ven: self.venueName, venId: self.id, owner: PFUser.current()!.username!, vote: 0)
                let qReply2 = try qComments.findObjects()
                for item in qReply2{
                    comment.commentOwner = item.object(forKey: "owner") as! String
                    comment.comment = item.object(forKey: "comment") as! String
                    comment.isFile = item.object(forKey: "image") as! Bool
                    if comment.isFile {
                        let dataPhoto:PFFile = item.object(forKey: "imgFile") as! PFFile
                        let imageData:NSData = try dataPhoto.getData()
                        let image:UIImage = UIImage(data:imageData as Data)!
                        comment.imageFile = image
                        comment.cellType = 2
                    }
                    temp.append(comment)

                }
                print("Comment",temp)

            }
            catch{
                print(error)
            }
        }
    }
    DispatchQueue.main.async {
        print(temp)
        self.commentList.removeAll()
        self.commentList = temp
        print("Comment",self.commentList)
        self.commentTableView.reloadData()

    }

}

最佳答案

你需要在后台线程结束时回到主线程。检查何时调用 DispatchQueue.main.async 方法。

    func getLocalComments(point:PFGeoPoint){
        var temp = [CommentDetails]()
        DispatchQueue.global(qos: .background).async {
            let qComments = PFQuery(className: "UserCommentary")
            let qDrinks = PFQuery(className: "venueDrinks")
            if self.type == "House Parties"{
                //Query the bars
                qDrinks.whereKey("venueName", equalTo: self.id)
                qDrinks.whereKey("venueID", equalTo: self.venueName)
                qDrinks.addDescendingOrder("createdAt")

                qComments.whereKey("venueID", equalTo: self.id)
                qComments.whereKey("venueName", equalTo: self.venueName)

                do{
                    var comment:CommentDetails = CommentDetails.init(comm: "Test", ven: self.venueName, venId: self.id, owner: PFUser.current()!.username!, vote: 0)
                    let qReply1 = try qDrinks.findObjects()
                    if qReply1.count>0{
                        var i = 0
                        while i < 2 {
                            let item = qReply1[i]
                            print(item)
                            comment.cellType = 2
                            i+=1
                        }
                        //temp.append(comment)
                    }
                    comment = CommentDetails.init(comm: "Test", ven: self.venueName, venId: self.id, owner: PFUser.current()!.username!, vote: 0)
                    let qReply2 = try qComments.findObjects()
                    for item in qReply2{
                        comment.commentOwner = item.object(forKey: "owner") as! String
                        comment.comment = item.object(forKey: "comment") as! String
                        comment.isFile = item.object(forKey: "image") as! Bool
                        if comment.isFile {
                            let dataPhoto:PFFile = item.object(forKey: "imgFile") as! PFFile
                            let imageData:NSData = try dataPhoto.getData()
                            let image:UIImage = UIImage(data:imageData as Data)!
                            comment.imageFile = image
                            comment.cellType = 2
                        }
                        temp.append(comment)

                    }
                    print("Comment",temp)
                    DispatchQueue.main.async {
                        print(temp)
                        self.commentList.removeAll()
                        self.commentList = temp
                        print("Comment",self.commentList)
                        self.commentTableView.reloadData()

                    }
                }
                catch{
                    print(error)
                }
            }
        }
    }

好的,那到底发生了什么?您知道当您创建异步后台线程时,它会与主线程一起执行。因此,如果您在后台线程和主线程中设置断点,您会注意到主线程可能首先启动。

在您的情况下,DispatchQueue.main.async 在后台线程填充临时数组之前执行。当您将 block 移动到 DispatchQueue.global(qos: .background).async block 内部时,它将在需要时在主线程中执行。

一句话,不是从上到下执行的!

关于ios - 无法填充到 UITableView Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39927967/

相关文章:

iphone - AVMutableAudioMix 和 AVAssetExportSession

ios - Swift:从 stackView 中消失 View

ios - 如何使用 ios-charts 在饼图 View 中获取所选切片的索引?

ios - CGPathAddCurveToPoint 的参数是什么意思?

ios - 如何拉伸(stretch)使用 UIBezierPath 绘制的线?

android - 如何在我的 flutter 项目中实现 flutter Text to Speech

ios - 如何在 Swift 中向后发送 UIView 元素

iOS 9 运行时 nop 死亡坑

ios - 快速日期格式化,从服务器返回的日期与发送到服务器的日期不同

ios - 为什么我不能在 Xcode 中添加管脚约束?