【问题标题】:Loading two different arrays into tableview (Swift)将两个不同的数组加载到 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 读取更多数据并将其附加到数组中。但这并不是很清楚。也不清楚您拥有所有这些类数组变量,但您并没有真正将它们用作类变量。你能澄清问题并解释代码在做什么吗?

标签: arrays swift firebase uitableview swift5


【解决方案1】:

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

  1. 不要在不需要的地方使用self。例如:self.DatabaseConnect
  2. 使用 DispatchGroup() 同时调用不相关的 API。
  3. 不要使用不必要的变量 myArrayguestArray 仅用于附加到主数组为什么不直接附加它。
  4. 使用[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 }
猜你喜欢
  • 2017-08-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-23
  • 1970-01-01
  • 2015-06-17
  • 2020-04-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多