将两个不同的数组加载到 tableview (Swift)

Posted

技术标签:

【中文标题】将两个不同的数组加载到 tableview (Swift)【英文标题】:Loading two different arrays into tableview (Swift) 【发布时间】:2020-05-17 20:33:32 【问题描述】:

我有两个函数,一个获取我的所有帖子,另一个获取我使用 Firebase 提取的访客帖子。我希望将这两个功能结合到我的表格视图中。最好的方法是什么?

var postArray = [Post]() //main array that feeds into tableview
var myArray = [Post]()
var guestArray = [Post]()
var DatabaseConnect = AuthenticationService()

private func fetchAllPosts() 
    self.DatabaseConnect.fetchMyPosts (myposts) in
        self.DatabaseConnect.fetchGuestPosts (posts) in
            self.myArray = myposts
            self.guestArray = posts
            self.postArray = self.myArray + self.guestArray
            self.tableView.reloadData()
        
    

【问题讨论】:

问题的问题是我们不知道DatabaseConnect 是做什么的,而且问题有点模糊。我们也不知道您使用的是 RTDB 还是 Firestore。听起来您正在从 Firebase 加载数据并填充一个数组,然后从 firebase 读取更多数据并将其附加到数组中。但这并不是很清楚。也不清楚您拥有所有这些类数组变量,但您并没有真正将它们用作类变量。你能澄清问题并解释代码在做什么吗? 【参考方案1】:

这里是你如何让它变得更好。

    不要在不需要的地方使用self。例如:self.DatabaseConnect。 使用 DispatchGroup() 同时调用不相关的 API。 不要使用不必要的变量 myArrayguestArray 仅用于附加到主数组为什么不直接附加它。 使用[weak self][unowned self] 同步后台任务。

代码如下:

var postArray = [Post]() //main array that feeds into tableview
var DatabaseConnect = AuthenticationService()

private func fetchAllPosts() 
    let group = DispatchGroup()
    postArray = []

    group.enter()
    DatabaseConnect.fetchMyPosts  [weak self] myposts in
        self?.postArray.append(contentsOf: myposts)
        group.leave()
    

    group.enter()
    DatabaseConnect.fetchGuestPosts  [weak self] guestPosts in
        self?.postArray.append(contentsOf: guestPosts)
        group.leave()
    

    group.notify(queue: .main) 
        self.tableView.reloadData()
    

【讨论】:

谢谢!但它似乎不起作用。一旦它击中 group.leave,postArray 似乎被清除了 我进行了一些编辑以添加一些我遗漏的内容。再次检查。 还是不行。当我在第一个 group.leave 之后打印 postArray 时,它会显示出来,但是当我在第二个 group.leave 之后打印 postArray 时,第一个 fetchMyPosts 数组没有显示出来。 尝试使用断点来理解工作流程,并在leave() 之前而不是之后使用打印语句。【参考方案2】:

为什么不直接重新加载表格视图两次:

   private func fetchAllPosts() 
        self.DatabaseConnect.fetchMyPosts (myposts) in
            self.postArray.append(myposts)
            self.tableView.reloadData()
        
        self.DatabaseConnect.fetchGuestPosts (guestPosts) in
            self.postArray.append(guestPosts)
            self.tableView.reloadData()
        
    

【讨论】:

因为我希望之后能够按日期对帖子进行排序 - 有没有办法做到这一点? 您的原始代码也没有对帖子进行排序。帖子中是否有日期变量?你写过代码来排序吗? 是的,我打算添加 self.postArray.sort $0.postDate > $1.postDate 但不知道将其放在代码中的哪个位置。如果我在第二个 postArray 之后添加排序,则初始加载不会对 myposts 和 guestposts 进行排序,只会对 guestPosts 进行排序。 尝试在每次 reloadData 之前添加两次。它应该是 self.postArray = self.postArray.sort $0.postDate > $1.postDate

以上是关于将两个不同的数组加载到 tableview (Swift)的主要内容,如果未能解决你的问题,请参考以下文章

通过 JSON 将图像数组加载到 tableview 图像视图中

将数组数据从 ViewController 传递到 TableView

如何将一个数组的tableview数据重新加载到另一个数组?

将数组加载到 TableView xCode

委托通过后无法将数据加载到tableview

如何根据点击的uibuttons加载具有不同NSArrays的相同tableview?